Python 3 int division运算符返回一个float?

McK*_*yla 3 python floating-point integer division python-3.x

在我的一个任务中,我遇到了一个奇怪的实现,我很好奇它是一个bug还是设计的行为.

在Python 3中,除法/返回浮点数,//表示整数除法,应该返回一个整数.我发现,如果在进行整数除法时其中任何一个值都是浮点数,它将返回一个浮点数.

例:

# These all work as expected
10 / 2
-> 5.0
11 / 2
-> 5.5
10 // 2
-> 5
11 // 2
-> 5
# Here things start to get weird
10.0 // 2
-> 5.0
10 // 2.0
-> 5.0
11.0 // 2
-> 5.0
Run Code Online (Sandbox Code Playgroud)

应该是这样的吗?如果是这样,为什么它会这样?

jon*_*rpe 11

来自PEP-238,它引入了新的部门(强调我的):

楼层划分的语义

Floor division将在所有Python数值类型中实现,并具有以下语义:

a // b == floor(a/b)
Run Code Online (Sandbox Code Playgroud)

除了结果类型将是在操作之前强制ab进入的公共类型.

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

特别是,如果ab都是int或long,则结果与这些类型的经典除法具有相同的类型和值(包括混合输入类型的情况; int//long并且long//int都将返回long).

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

3.5//2.0 == 1.0
Run Code Online (Sandbox Code Playgroud)

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

对于用户定义的类和扩展类型,所有语义都取决于类或类型的实现.

所以是的,它应该表现得那样." //表示整数除法并且应该返回一个整数" - 不完全,它表示地板除法并且应该返回等于整数的东西((a // b).is_integer()在任何操作数都是浮点数的情况下,您总是期望为真).

  • 有趣的是,[PEP 3141](https://www.python.org/dev/peps/pep-3141)建议`__floordiv__`特殊方法应该总是返回一个`Integral`实例,但PEP 3141的那部分从未得到过为`float`类型实现.另见https://bugs.python.org/issue22444. (3认同)