当除数和/或被除数是浮点数时,为什么 Python 下限除法返回浮点数?

Doo*_*oot -1 python floating-point precision arbitrary-precision floor-division

如果我理解正确的话,下限除法的返回值始终是整数,即使被除数和/或除数不是整数,那么为什么它不总是返回整数。

在我的例子中这是有害的,因为从大浮点数转换为 int 而不是将返回值作为任意精度整数显然会损失精度。

我看不到任何执行浮点除法以返回整数的函数。显然我可以创建一个函数来执行此操作,例如将两个值乘以相同的数量,以便它们都是整数,但它会比 C 实现慢很多。

这是一个例子:5.2 // 2不是2.02

Boa*_*les 5

回答你的问题为什么?,这是设计使然,其基本原理在PEP 238中:

楼层划分将在所有 Python 数字类型中实现,并且具有以下语义:

a // b == floor(a/b)

只不过结果类型将是ab在操作之前被强制转换成的公共类型。

具体来说,如果ab属于同一类型,a//b则 a 和 b 也属于该类型。如果输入属于不同类型,则首先使用用于所有其他算术运算符的相同规则将它们强制为通用类型。

...

对于浮点输入,结果是浮点数。例如:

3.5//2.0 == 1.0

对于复数,//会引发异常,因为floor()不允许使用复数。

此 PEP 可以追溯到 Python 2.2。我删除了一段讨论int和之间现已过时的区别的段落long