我想知道导致这种行为的原因。我无法找到涵盖这一点的答案。它可能是简单而明显的东西,但它不适合我。我在python 2.7.3
中使用Ubuntu
。
In [1]: 2 == 1.9999999999999999
Out[1]: True
In [2]: 2 == 1.999999999999999
Out[2]: False
编辑:
澄清我的问题。是否有一个书面的(在文档中)最大数量为9的,其中python会将上面的表达式评估为等于2?
答案 0 :(得分:7)
1.9999999999999999
最接近的64位浮点值为2.0
,因为64位浮点值(所谓的“双精度”)使用52位有效数,相当于约15位小数位。因此,文字1.9999999999999999
只是写2.0
的另一种方式。但是,与1.999999999999999
最接近的值小于2.0
(我认为它是1.9999999999999988897769753748434595763683319091796875
,但是我太懒了,无法检查是否正确,我只是依赖于Python的格式代码确切地说。)。因此,1.9999999999999999 == 2
的原因与2.0 == 2
相同(Python允许包含比较的混合类型数值运算,并且整数2
等于float 2.0
) 。而1.999999999999999 != 2
。
答案 1 :(得分:3)
类型强制
>>> 2 == 2.0
True
可以在python中表示的最大位数的后果:
>>> import sys
>>> sys.float_info.dig
15
>>> 1.9999999999999999
2.0
更多来自文档
>>> float('9876543211234567')
9876543211234568.0
注意..68
而不是预期的..67
答案 2 :(得分:2)
这是由于在Python中实现浮点数的方式。保持简洁和简单:由于浮点数几乎总是近似值,因此比大多数人认为有用的数字更多,Python解释器显示舍入值。
更详细,浮点数以二进制形式存储。这意味着它们作为分数存储到基数2,与十进制不同,您可以将浮点数显示为基数为10.但是,大多数小数部分没有精确表示二进制文件。因此,它们通常以53位的精度存储。如果你想做更复杂的算术运算,这会使它们变得毫无用处,因为你会遇到一些奇怪的问题,例如: G:
>>> 0.1 + 0.2
0.30000000000000004
>>> round(2.675, 2)
2.67
同样请参阅The docs on floats。
答案 3 :(得分:1)
从数学上讲,2.0确实等于1.9999 ......永远。它们是编写相同数字的两种不同方式。
然而,在软件中,永远不要比较两个浮点数或小数是否相等 - 相反,减去它们,取绝对值,并验证(总是正数)差异是否足够低。
EG:
if abs(value1 - value2) < 1e10:
# they are close enough
else:
# they are not
您可能应该设置EPSILON = 1e10,并在整个代码中使用符号常量而不是散布1e10,或者更好地使用比较函数。