0

我想知道是什么导致了这种行为。我无法找到涵盖此问题的答案。这可能是简单而明显的事情,但对我来说不是。我正在使用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

4 回答 4

7
  • Python 使用浮点表示
  • 浮点实际上是一个固定宽度的二进制数(称为“有效数字”)加上一个小整数,告诉您将该值移动多少次方(“指数”)。加上一个符号位。就像科学记数法一样,但以 2 为底而不是 10。
  • 最接近的 64 位浮点值1.99999999999999992.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.

于 2013-11-13T22:02:22.190 回答
3

类型强制

>>> 2 == 2.0
True

以及可以在python中表示的最大位数的后果:

>>> import sys
>>> sys.float_info.dig
15
>>> 1.9999999999999999
2.0

更多来自文档

>>> float('9876543211234567')
9876543211234568.0

注意..68最后而不是预期..67

于 2013-11-13T21:50:07.623 回答
2

这是由于在 Python 中实现浮点数的方式。为了保持简短和简单:由于浮点数几乎总是一个近似值,因此比大多数人认为有用的数字多,Python 解释器显示一个四舍五入的值。

更详细地说,浮点数以二进制形式存储。这意味着它们存储为以 2 为底的分数,与十进制不同,您可以将浮点数显示为以 10 为底的分数。但是,大多数十进制分数没有二进制的精确表示。因此,它们通常以 53 位的精度存储。如果您想做更复杂的算术运算,这会使它们几乎无用,因为您会遇到一些奇怪的问题,例如:

>>> 0.1 + 0.2
0.30000000000000004
>>> round(2.675, 2)
2.67

另请参阅有关浮动的文档

于 2013-11-13T21:57:29.450 回答
1

从数学上讲,2.0 确实等于 1.9999……永远。它们是写相同数字的两种不同方式。

但是,在软件中,重要的是永远不要比较两个浮点数或小数是否相等 - 相反,将它们相减,取绝对值,并验证(始终为正的)差异对于您的目的是否足够低。

例如:

if abs(value1 - value2) < 1e10:
   # they are close enough
else:
   # they are not

您可能应该设置 EPSILON = 1e10,并使用符号常量而不是在整个代码中分散 1e10,或者最好还是使用比较函数。

于 2013-11-13T22:05:56.700 回答