整数除法与向下取整商的比较:为何会出现这个惊人结果?
今天,Python 的 //
"整数除法" 操作符让我感到惊讶:
>>> math.floor(11/1.1)
10.0
>>> 11//1.1
9.0
文档上写着“x 和 y 的(向下取整)商”。那么,为什么 math.floor(11/1.1) 的结果是 10,而 11//1.1 的结果却是 9 呢?
1 个回答
7
因为1.1在计算机里不能被准确地用二进制表示,所以它的近似值稍微大于1.1,因此进行除法运算时结果会有点偏小。
你可以试试下面的操作:
在Python 2中,在控制台输入:
>>> 1.1
1.1000000000000001
在Python 3.1中,控制台会显示1.1
,但实际上它内部还是那个数字。
但是:
>>> 11/1.1
10.0
正如gnibbler所说,这个结果是因为浮点数在精度范围内的“内部舍入”造成的。而正如The MYYN在评论中提到的,//
使用了不同的算法来计算向下取整的结果,以尽量保持a == (a//b)*b + a%b
这个关系。
如果你需要这种精度,可以使用Decimal
类型。