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

Mus*_*aab 20 python math python-3.x

可能重复:
浮点数是如何存储的?什么时候重要?

为什么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
>>> 
Run Code Online (Sandbox Code Playgroud)

为什么不0.2 + 0.1 = 0.3呢?

Fre*_*Foo 14

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

>>> .1
Run Code Online (Sandbox Code Playgroud)

Python会响应,.1因为它只打印到一定的精度,但已经有一个小的舍入错误.发生同样的事情.3,但是当你发布时

>>> .2 + .1
0.30000000000000004
Run Code Online (Sandbox Code Playgroud)

那么舍入误差.2.1积累.另请注意:

>>> .2 + .1 == .3
False
Run Code Online (Sandbox Code Playgroud)

  • http://0.30000000000000004.com/ (5认同)
  • 并且0.2 ;-) 3中的任何一个都不能表示为(-1)^符号*1.fraction*2 ^(exp-127)参见http://en.wikipedia.org/wiki/IEEE_754-1985从重复的源http://stackoverflow.com/questions/56947/回答http://stackoverflow.com/questions/56947/how-is-floating-point-stored-when-does-it-matter/57031#57031如何-是浮点存储 - 当 - 做 - 它事项 (2认同)

Dav*_*nan 11

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

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

我推荐Rob Kennedy的有用网页作为探索可表示性的好工具.