我刚刚开始使用python教程。为什么
print int (100*(11.20 - 11))
在python中打印19
而不是20
?有一些整数由整数完成,但我无法理解。感谢帮助。
答案 0 :(得分:7)
这是因为11.20
不完全是1120/100但略低于此。所以11.20 - 11
最终会略低于20/100(*)。乘以100
,11.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