我想知道是什么导致了这种行为。我无法找到涵盖此问题的答案。这可能是简单而明显的事情,但对我来说不是。我正在使用python 2.7.3
.Ubuntu
In [1]: 2 == 1.9999999999999999
Out[1]: True
In [2]: 2 == 1.999999999999999
Out[2]: False
编辑:
澄清我的问题。是否有书面的(在文档中)最大数量为 9,python 会将上面的表达式评估为等于 2?
我想知道是什么导致了这种行为。我无法找到涵盖此问题的答案。这可能是简单而明显的事情,但对我来说不是。我正在使用python 2.7.3
.Ubuntu
In [1]: 2 == 1.9999999999999999
Out[1]: True
In [2]: 2 == 1.999999999999999
Out[2]: False
编辑:
澄清我的问题。是否有书面的(在文档中)最大数量为 9,python 会将上面的表达式评估为等于 2?
1.9999999999999999
是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
.
类型强制
>>> 2 == 2.0
True
以及可以在python中表示的最大位数的后果:
>>> import sys
>>> sys.float_info.dig
15
>>> 1.9999999999999999
2.0
更多来自文档
>>> float('9876543211234567')
9876543211234568.0
注意..68
最后而不是预期..67
这是由于在 Python 中实现浮点数的方式。为了保持简短和简单:由于浮点数几乎总是一个近似值,因此比大多数人认为有用的数字多,Python 解释器显示一个四舍五入的值。
更详细地说,浮点数以二进制形式存储。这意味着它们存储为以 2 为底的分数,与十进制不同,您可以将浮点数显示为以 10 为底的分数。但是,大多数十进制分数没有二进制的精确表示。因此,它们通常以 53 位的精度存储。如果您想做更复杂的算术运算,这会使它们几乎无用,因为您会遇到一些奇怪的问题,例如:
>>> 0.1 + 0.2
0.30000000000000004
>>> round(2.675, 2)
2.67
另请参阅有关浮动的文档。
从数学上讲,2.0 确实等于 1.9999……永远。它们是写相同数字的两种不同方式。
但是,在软件中,重要的是永远不要比较两个浮点数或小数是否相等 - 相反,将它们相减,取绝对值,并验证(始终为正的)差异对于您的目的是否足够低。
例如:
if abs(value1 - value2) < 1e10:
# they are close enough
else:
# they are not
您可能应该设置 EPSILON = 1e10,并使用符号常量而不是在整个代码中分散 1e10,或者最好还是使用比较函数。