1 == 2表示大量的1

时间:2013-11-13 21:49:18

标签: python python-2.7

我想知道导致这种行为的原因。我无法找到涵盖这一点的答案。它可能是简单而明显的东西,但它不适合我。我在python 2.7.3中使用Ubuntu

In [1]: 2 == 1.9999999999999999
Out[1]: True

In [2]: 2 == 1.999999999999999
Out[2]: False

编辑:

澄清我的问题。是否有一个书面的(在文档中)最大数量为9的,其中python会将上面的表达式评估为等于2?

4 个答案:

答案 0 :(得分:7)

  • Python使用浮点表示
  • 实际上浮点数是一个固定宽度的二进制数(称为“有效数字”)加上一个小整数来告诉你将该值移动多少两个幂(“指数”)。加上一个标志位。就像科学记谱法一样,但在2号而不是10号。
  • 1.9999999999999999最接近的64位浮点值为2.0,因为64位浮点值(所谓的“双精度”)使用52位有效数,相当于约15位小数位。因此,文字1.9999999999999999只是写2.0的另一种方式。但是,与1.999999999999999最接近的值小于2.0(我认为它是1.9999999999999988897769753748434595763683319091796875,但是我太懒了,无法检查是否正确,我只是依赖于Python的格式代码确切地说。)。
  • 我实际上并不知道Python语言是否需要特定使用64位浮点数,或者是CPython的实现细节。但无论使用什么大小,重要的不是小数位数,它是该大小的最接近的浮点值位于十进制文字的位置。某些文字比其他文字更接近。

因此,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,或者更好地使用比较函数。