Python 为什么,在浮点运算中,0.99999999999=1但0.99999999+;1 == 2

Python 为什么,在浮点运算中,0.99999999999=1但0.99999999+;1 == 2,python,floating-point,precision,Python,Floating Point,Precision,我知道这一定是另一个浮点精度问题:设x为0.9999999999。然后在浮点运算中x+1==2,但是x!=1.发生了什么事?下面是我在ipython控制台上尝试的内容 In [55]: x = 0.9999999999999999 In [56]: x==1 Out[56]: False In [57]: x+1==2 Out[57]: True [编辑]关于浮点计算中断的现有问题主要是关于FP表示错误,这似乎不是这里的主要原因 在0.5到1.0的间隔内,与1.0到2.0的间隔内小数部分的

我知道这一定是另一个浮点精度问题:设x为0.9999999999。然后在浮点运算中x+1==2,但是x!=1.发生了什么事?下面是我在ipython控制台上尝试的内容

In [55]: x = 0.9999999999999999

In [56]: x==1
Out[56]: False

In [57]: x+1==2
Out[57]: True

[编辑]关于浮点计算中断的现有问题主要是关于FP表示错误,这似乎不是这里的主要原因

0.5
1.0
的间隔内,与
1.0
2.0
的间隔内小数部分的位数相比,小数部分多了一位。所以这是意料之中的

您可以使用另一个示例:

0.9999999999 + 1234567890.0
其中第一个加数中有十位数字
9


双精度(即64位)(二进制)浮点类型的精度约为十六位十进制数字。因此,一个数字只能从大约16位数字的“第一位”(即最高有效位)记忆。

您使用的浮点格式的有效位中有53位。这意味着它可以将数字表示为53位整数乘以或除以二的幂

0.9999999999999
转换为该格式时,最接近的可表示值为(253−1) /253,正好是0.999999999988897769753748434595763683319091796875。请注意,分子正好使用53位

当你加1时,数学结果是(254−1)/253. 分子将有54位。这不能用浮点格式表示,因此必须四舍五入以适应。两个最接近的可表示值为:

  • (254)−2)/253 = (253−1) /252,以及
  • (254)−0)/253=2
这两者都与精确的数学结果相去甚远。断开连接的规则是使用有效位低位带零的值。(尽管我在这里将有效位表示为整数,但它是浮点格式的“左调整”分数,因此1的分子对应于二进制数字1.000000…0002。)


因此,当将1添加到
0.9999999999999
中时,计算结果必须四舍五入到2。

可能重复的“查看我的编辑”。这不是重复的imho。