为什么 print int (100*(11.20 - 11)) 在 python 中打印 19 而不是 20?

Why does print int (100*(11.20 - 11)) prints 19 instead of 20 in python?

我刚刚开始 python 教程。为什么

print  int (100*(11.20 - 11))

打印 19 而不是 python 中的 20 ??整数进行了某种舍入,但我无法理解。感谢帮助。

发生这种情况是因为 11.20 不完全是 1120/100,而是略小于 1120/100。所以 11.20 - 11 最终略小于 20/100 (*)。乘以 10011.20 - 11 产生略低于 20 的浮点数,并且由于 int(...) 截断(向零舍入),结果为 19。

出于效率原因,浮点数表示为以 2 的幂为分母的分数。所以 1/2, 1/4, 1/16, … 可以精确表示为浮点数,但 1/5 不能(没有 2 的幂可以用作分母来精确表示 1/5) .

(*) 这个浮点数减法刚好是精确的,所以结果相对于20/100的绝对误差和11.20相对于1120/100的绝对误差是完全一样的。请注意,相对误差被放大了,因为相同的绝对误差应用于更小的值。减去已经不精确且接近 is called “catastrophic cancellation” 的值,以及 Python 行中的减法就是这样的灾难性取消。

11.2 - 11

实际产量

0.1999999999999993

四舍五入为 19。

如前所述,这是一个浮点精度的舍入问题。你可以看到使用 :

print '%.20f' % (100*(11.20 - 11))
>>> 19.99999999999992894573

在Python int() truncates toward 0 for reasons Guido explains here. This means negative numbers will actually see the opposite effect (related SO question & answer).