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?)
4

2 回答 2

11

因为第一次计算没有准确返回2.0:

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

print将浮点显示限制为仅 12 位有效数字,导致值四舍五入为 2.0。

于 2013-07-05T16:24:07.157 回答
0

@Bakuriu 在评论中为您得到了长答案。

简而言之,在浮点数之间进行相等比较是完全不对的。始终选择适当的 epsilon 值(误差范围),以确保所需整数与计算结果之间的差异在您的容许误差范围内。

假设您设置eps = 1e-5(误差在 +/- 0.00001 内)

然后你可以做

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

注意:您也可以执行 <=,具体取决于您的精度需求。

于 2013-07-05T16:37:09.477 回答