简单的基本Python比较

时间:2012-10-16 00:02:41

标签: python types numbers compare

我在做作业时发现了这个有趣的问题 我们知道,47.36/1.6**2 == 18.5

但是当我尝试运行以下代码时,它会给我一个假(应该是真的)

打印47.36/1.6**2 == 18.5

有谁知道发生了什么事?

6 个答案:

答案 0 :(得分:4)

你可能会得到像18.49999999999这样的答案,而完全等于18.5。

与往常一样,相关参考资料为What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:1)

>>> 47.36/1.6**2
18.499999999999996

See this page on Floating Point Arithmetic: Issues and Limitations

以下是使用decimal模块在​​不使用任何舍入或“足够接近”行为的情况下,如何精确计算18.5的方法:

>>> from decimal import Decimal
>>> Decimal('47.36') / Decimal('1.6')**2 == Decimal('18.5')
True
>>> float(Decimal('47.36') / Decimal('1.6')**2) == 18.5
True

答案 2 :(得分:1)

简短回答:IEEE 754浮点数不能精确地表示分母不是2的幂的分数,如1 / 4,1 / 16,1 / 256等。你可以得到非常接近,给予足够的数字,但从来没有完全在那里。

通过将“equals”定义为“在某个delta内”来比较浮点数。你可以这样写:

def almost_equals(a, b, delta=0.0005):
    return abs(a - b) <= delta

然后测试“可能相等”:

>>> almost_equals(47.36/1.6**2, 18.5)
True

答案 3 :(得分:1)

在比较两个浮点数时,我会避免检查确切的相等性。取而代之的是看看它是否小于你认为接近零的值。

(47.36 / 1.6 ** 2 - 18.5)&lt; 0.00000000001

将是

答案 4 :(得分:1)

正如其他人所说:

>>> 47.36/1.6**2
18.499999999999996

但是,据我所知,这不是由于浮点运算问题。即使您通过在Decimal()中包裹操作数来使用十进制数学(在from decimal import Decimal之后),您仍然会得到Decimal('18.49999999999999772404279952')作为答案。

我可能在这里使用Decimal()错了,我的结果也有某种浮点错误;但是,如果我是正确的,无论你使用什么样的数学,那个表达式都不等于18.5

编辑:正如Greg在评论中指出的那样,我的方法问题在于,Decimal(1.6)只会将1.6的浮点表示(完整不准确)转换为Decimal。这给出了正确的答案:

>>> Decimal('47.36') / Decimal('1.6')**2
Decimal('18.5')

更好的方法是使用Kirk建议的fractions模块。

答案 5 :(得分:-2)

47.36 / 1.6 * 2返回整数。所以47.36 / 1.6 * 2将是18,这不等于18.5。

修改

很抱歉,实际上它存储为18.499999 你应该这样做

import numpy as np
print np.around((47.36/1.6**2), decimals=1) == 18.5

这将返回True。