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

为什么print int(100*(11.20-11))在python中打印19而不是20?,python,floating-point,int,Python,Floating Point,Int,我刚刚开始学习python教程。为什么 print int (100*(11.20 - 11)) 用python打印19而不是20??整数可以进行某种舍入,但我无法理解。非常感谢您的帮助。之所以会出现这种情况,是因为11.20不完全是1120/100,但略小于1120/100。因此11.20-11最终略小于20/100(*)。乘以100,11.20-11产生一个略低于20的浮点数,由于int(…)截断(向零舍入),结果是19 出于效率考虑,浮点数表示为分母为二次幂的分数。因此,1/2、1/4

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

print  int (100*(11.20 - 11))

用python打印
19
而不是
20
??整数可以进行某种舍入,但我无法理解。非常感谢您的帮助。

之所以会出现这种情况,是因为
11.20
不完全是1120/100,但略小于1120/100。因此
11.20-11
最终略小于20/100(*)。乘以
100
11.20-11
产生一个略低于20的浮点数,由于
int(…)
截断(向零舍入),结果是19

出于效率考虑,浮点数表示为分母为二次幂的分数。因此,1/2、1/4、1/16……可以精确地表示为浮点数,但1/5不能(没有二的幂可以用作分母来精确地表示1/5)

(*)这个浮点减法恰好是精确的,因此与20/100相比,结果的绝对误差与11.20与1120/100相比的绝对误差完全相同。请注意,相对误差被放大,因为相同的绝对误差应用于更小的值。对已经不精确且接近的值进行减法,Python行中的减法就是这样一种灾难性的取消

11.2 - 11
实际收益

0.1999999999999993

这是一个浮点精度的舍入问题。您可以通过以下方式看到:

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

在Python中,向0截断。这意味着负数实际上会看到相反的效果()。

更不用说
print 100*(11.20-11)
会重复@dwn的
20.0
事实上,如果你想从技术上了解它,问题是
+
不准确,而在这个问题中,问题是
11.20
并不完全是
1120/100
,如果我没有弄错的话,所有浮点运算都是精确的。引用的问题包括不止一个运算,就像answers@dwn公认的答案是关于
==
(在这个问题中没有出现的相等运算符),并且没有解释为什么当涉及的所有浮点运算都是精确的时,浮点结果应该与预期结果不同。“flooding”表示向-无穷大舍入。
int(…)
截断,这意味着向0舍入。它们对于正数是相同的,但对于负数则不同。