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

时间:2015-01-05 20:11:54

标签: python floating-point int

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

print  int (100*(11.20 - 11))

在python中打印19而不是20?有一些整数由整数完成,但我无法理解。感谢帮助。

4 个答案:

答案 0 :(得分:7)

这是因为11.20不完全是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行中的减法是一种灾难性的取消。

答案 1 :(得分:4)

11.2 - 11

实际上是收益

0.1999999999999993

向下舍入到19。

答案 2 :(得分:1)

在Python int()中截断为0 for reasons Guido explains here。这意味着负数实际上会看到相反的效果(related SO question & answer)。

答案 3 :(得分:0)

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

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