为什么Python会在不该返回False的情况下返回False语句?

3

以这段代码为例:

print 2.0 == 2 #---> returns True

print 12 % 5 #---> returns 2
print ((12.0 / 5) - (12 / 5)) * 5 #---> returns 2.0

print ((12.0 / 5) - (12 / 5)) * 5 == 12 % 5 #---> returns False (What the hell happens here?)

((12.0 / 5) - (12 / 5)) * 5 不是 2.0。 - Ashwini Chaudhary
5
《计算机科学家应该了解的浮点运算知识》是一篇由David Goldberg撰写的技术论文。它详细介绍了使用浮点数表示实数时可能会遇到的问题,以及如何在编程中处理这些问题。本文适用于任何使用浮点数进行数值计算的计算机科学家和程序员。 - Bakuriu
此外,这在Python 2和3之间有所不同。Python2:((12.0 / 5) - (12 / 5)) * 5 = 1.9999999999999996,Python3:((12.0 / 5) - (12 / 5)) * 5 = 0.0 - user626998
@BrandonInvergo:在Python 3中使用//进行整数除法:((12.0 / 5) - (12 // 5)) * 5 - Martijn Pieters
@MartijnPieters...每天都能学到新东西...谢谢! - user626998
显示剩余2条评论
2个回答

11

因为第一次计算未能精确地返回2.0:

>>> ((12.0 / 5) - (12 / 5)) * 5
1.9999999999999996

print 仅限显示12个有效数字的浮点数,这会导致该值被四舍五入为2.0。


0

@Bakuriu在评论中为您提供了详细的答案。

简而言之,在浮点数之间进行等式比较是完全不正确的。必须选择一个适当的 epsilon 值(误差范围),以确保期望整数和计算结果之间的差异在可容忍的误差范围内。

假设你设置 eps = 1e-5(误差范围为 +/- 0.00001)

那么你可以这样做:

print abs(((12.0 / 5) - (12 / 5)) * 5 - 12 % 5) < eps

注意:你也可以根据精度需求使用 <=。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接