整数除法与商数相比:为什么这个令人惊讶的结果呢?

Eri*_*got 9 python python-2.x integer-division floor python-3.x

//Python 的"整数除法"运算符让我感到惊讶,今天:

>>> math.floor(11/1.1)
10.0
>>> 11//1.1
9.0
Run Code Online (Sandbox Code Playgroud)

文档读取"x和y"的"(浮动)商".那么,为什么math.floor(11/1.1)等于10,但是11 // 1.1等于9?

Tim*_*ker 6

因为1.1不能以二进制形式准确表示; 近似值小于1.1 - 因此除法结果有点太小.

请尝试以下方法:

在Python 2下,在控制台键入:

>>> 1.1
1.1000000000000001
Run Code Online (Sandbox Code Playgroud)

在Python 3.1中,控制台将显示1.1,但在内部,它仍然是相同的数字.

但:

>>> 11/1.1
10.0
Run Code Online (Sandbox Code Playgroud)

正如gnibbler指出的那样,这是浮点数可用精度限制内"内部舍入"的结果.正如MYYN在他的评论中指出的那样,//使用不同的算法来计算分层结果,而不是math.floor()为了尽可能保留a == (a//b)*b + a%b.

Decimal如果需要此精度,请使用该类型.