首页 > 解决方案 > 当除数和/或被除数是浮点数时,为什么 Python 地板除法会返回浮点数?

问题描述

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

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

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

举个例子:5.2 // 2不是。2.02

标签: pythonfloating-pointprecisionarbitrary-precisionfloor-division

解决方案


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

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

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

除了结果类型将是在操作之前将ab强制转换为的通用类型。

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

...

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

3.5//2.0 == 1.0

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

这个 PEP 可以追溯到 Python 2.2。我已经取消了一段讨论和之间现在已经过时的区别的int段落long


推荐阅读