我知道浮点数计算可能非常棘手,但我想知道是否有人可以解释以下怪现象。在我测试的大多数编程语言中,将0.4加上0.2会产生轻微误差,而0.4 + 0.1 + 0.1则不会。
两个计算结果不同的原因是什么?在相应的编程语言中,可以采取哪些措施来获得正确的结果。
在Python2/3中
.4 + .2
0.6000000000000001
.4 + .1 + .1
0.6
在 Julia 0.3 中也是如此。
julia> .4 + .2
0.6000000000000001
julia> .4 + .1 + .1
0.6
以及 Scala:
scala> 0.4 + 0.2
res0: Double = 0.6000000000000001
scala> 0.4 + 0.1 + 0.1
res1: Double = 0.6
以及 Haskell:
Prelude> 0.4 + 0.2
0.6000000000000001
Prelude> 0.4 + 0.1 + 0.1
0.6
但是 R v3 做得很好:
> .4 + .2
[1] 0.6
> .4 + .1 + .1
[1] 0.6
format(.4 + .1 + .1, digits=17)
和format(.4 + .2, digits=17)
。 - tonytonov