2

私は、いくつかの論理条件で数値の等価性が重要な要素であるコードに取り組んでいます。Clojure は、私が説明するのに十分な知識を持っていないことを行っています。例えば:

user=> (- 5 4.9)
0.09999999999999964
user=> (- 5 4.8)
0.20000000000000018
user=> (- 5 2.9)
2.1
user=> (- 5 2.7)
2.3
user=> (- 5 2.8)
2.2
user=> (- 9 6.9)
2.0999999999999996 
user=> (- 9 2.9)
6.1

状況によっては、Clojure の数値は 0.1 への減算を理解するようですが、そうでない場合もあります。ここで何が起こっているのですか?

4

2 に答える 2

6

デフォルトでは、これらの結果は 10 進数で表され、固有の丸め誤差があります。文字 M を接尾辞として付けることで、BigDecimals の使用に切り替えることができます。

user=> (- 5M 4.9M)
0.1M
user=> (- 5M 4.8M)
0.2M
user=> (- 9M 6.9M)
2.1M
user=> (- 9M 2.9M)
6.1M

10 進数の変数で同じことを行うには、bigdec 形式を使用します。

user=> (def k 4.9)
#'user/k
user=> (- 5M k)
0.09999999999999964
user=> (- 5M (bigdec k))
0.1M
于 2013-05-28T20:40:21.603 に答える