有人可以解释一下:0.2 + 0.1 = 0.30000000000000004?

时间:2011-09-25 10:44:07

标签: python python-3.x math

  

可能重复:
  How is floating point stored? When does it matter?

为什么Python解释器中会出现以下情况?

>>> 0.1+0.1+0.1-0.3
5.551115123125783e-17
>>> 0.1+0.1
0.2
>>> 0.2+0.1
0.30000000000000004
>>> 0.3-0.3
0.0
>>> 0.2+0.1
0.30000000000000004
>>> 

为什么不0.2 + 0.1 = 0.3

2 个答案:

答案 0 :(得分:12)

那是因为.1无法在二进制浮点表示中精确表示。如果你试试

>>> .1

Python将以.1响应,因为它只打印一定的精度,但已经有一个小的舍入错误。 .3会发生同样的情况,但是当您发出

>>> .2 + .1
0.30000000000000004

然后.2.1中的舍入错误会累积。另请注意:

>>> .2 + .1 == .3
False

答案 1 :(得分:11)

并非所有浮点数都可以在有限的机器上精确表示。在二进制浮点中,0.1和0.2都不能精确表示。而且也不是0.3。

如果数字是a / b形式,其中a和b是整数,b是2的幂,则数字是完全可表示的。显然,数据类型需要具有足够大的有效数来存储数字。

我建议使用Rob Kennedy's useful webpage作为探索可表示性的好工具。