在我的一项任务中,我遇到了一个奇怪的实现,我很好奇它是错误还是设计行为。
在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
这 应该 是这样吗?如果是这样, 为什么 会这样呢?
从介绍了新部门(强调我的部门)的PEP-238:
楼层划分的语义 地板分割将在所有Python数字类型中实现,并将具有以下语义: a // b == floor(a/b) 除了结果类型将是操作之前将 a 和 b 强制转换为的普通类型。 具体来说,如果 a 和 b 属于同一类型,则a//b也将属于该类型。如果输入的类型不同,则首先使用与所有其他算术运算符相同的规则将它们强制转换为公共类型。 特别是,如果 a 和 b 均为整数或长整型,则结果的类型和值与这些类型的经典除法相同(包括混合输入类型的情况;int//long并且long//int都将返回长整型)。 对于浮点输入,结果为浮点数。 例如: 3.5//2.0 == 1.0 对于复数,//会引发一个例外,因为floor()不允许使用复数。 对于用户定义的类和扩展类型,所有语义均取决于该类或类型的实现。
地板分割将在所有Python数字类型中实现,并将具有以下语义:
a // b == floor(a/b)
除了结果类型将是操作之前将 a 和 b 强制转换为的普通类型。
具体来说,如果 a 和 b 属于同一类型,则a//b也将属于该类型。如果输入的类型不同,则首先使用与所有其他算术运算符相同的规则将它们强制转换为公共类型。
a//b
特别是,如果 a 和 b 均为整数或长整型,则结果的类型和值与这些类型的经典除法相同(包括混合输入类型的情况;int//long并且long//int都将返回长整型)。
int//long
long//int
对于浮点输入,结果为浮点数。 例如:
3.5//2.0 == 1.0
对于复数,//会引发一个例外,因为floor()不允许使用复数。
floor()
对于用户定义的类和扩展类型,所有语义均取决于该类或类型的实现。
是的,它应该以这种方式运行。 “//表示整数除法,应该返回整数” -不完全是,它表示 底数除法, 并且应该返回 等于 整数的值((a // b).is_integer()如果两个操作数均为浮点数,则始终希望为true)。
(a // b).is_integer()