为什么`0.4/2`等于'0.2`同时`0.6/3`等于`0.19999999999999998`在python中?

Zen*_*Zen 0 python floating-point floating-accuracy ieee-754

我知道这些是浮点分割.但为什么这两个公式表现不同?

我做了一些调查,结果使我更加困惑:

>>>0.9/3
0.3

>>>1.2/3
0.39999999999999997

>>>1.5/3
0.5
Run Code Online (Sandbox Code Playgroud)

这里用什么逻辑来决定结果是用小数点后一位打印还是更多?

PS:我用python3.4做了上面的实验.

Ran*_*832 6

因为浮点结果的确切值略有不同.

>>> '%.56f' % 0.4
'0.40000000000000002220446049250313080847263336181640625000'
>>> '%.56f' % (0.4/2)
'0.20000000000000001110223024625156540423631668090820312500'
>>> '%.56f' % 0.6
'0.59999999999999997779553950749686919152736663818359375000'
>>> '%.56f' % (0.6/3)
'0.19999999999999998334665463062265189364552497863769531250'
>>> '%.56f' % 0.2
'0.20000000000000001110223024625156540423631668090820312500'
>>> (0.2 - 0.6/3) == 2.0**-55
True
Run Code Online (Sandbox Code Playgroud)

如您所见,打印为"0.2"的结果确实略微接近0.2.我在最后添加了这个位,以显示这两个数字之间差异的确切值.(如果你很好奇,上面的表示是准确的值 - 添加任何数字以外的数字只会增加更多的零).


rho*_*ron 5

查看python中有关浮点数的文档.

最具体的:

有趣的是,有许多不同的十进制数,它们具有相同的最接近的近似二进制分数.例如,数字0.1和0.10000000000000001和0.1000000000000000055511151231257827021181583404541015625都近似为3602879701896397/2**55.由于所有这些十进制值共享相同的近似值,因此可以显示其中任何一个,同时仍保留不变eval(repr(x) )== x.

从历史上看,Python提示符和内置的repr()函数将选择具有17位有效数字的0.10000000000000001.从Python 3.1开始,Python(在大多数系统上)现在能够选择最短的这些并且只显示0.1.