今天,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?
今天,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.1 不能精确地用二进制形式表示;近似值略高于 1.1 - 因此除法结果有点太小。
尝试以下操作:
在 Python 2 下,在控制台输入:
>>> 1.1
1.1000000000000001
在 Python 3.1 中,控制台将显示1.1
,但在内部,它仍然是相同的数字。
但:
>>> 11/1.1
10.0
正如 gnibbler 指出的那样,这是在浮点数的可用精度限制内“内部舍入”的结果。并且正如 MYYN 在他的评论中指出的那样,//
使用不同的算法来计算地板除法结果而不是math.floor()
为了尽可能地保存a == (a//b)*b + a%b
。
Decimal
如果需要此精度,请使用类型。