整数除法与向下取整商的比较:为何会出现这个惊人结果?

10 投票
1 回答
7794 浏览
提问于 2025-04-15 17:44

今天,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类型。

撰写回答