在我的一项任务中,我遇到了一个奇怪的实现,我很好奇它是否是一个错误或设计行为。
在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
这个假定这样做吗?如果是这样,那么为什么会这样做?
答案 0 :(得分:9)
来自PEP-238,介绍了新部门(强调我的):
分区语义
分区将在所有Python数值类型中实现, 并将具有以下语义:
a // b == floor(a/b)
除了结果类型是 a 和的常见类型 在操作之前强制 b 。
具体而言,如果 a 和 b 属于同一类型,
a//b
也属于该类型。如果输入是不同类型的,它们是第一个 使用与所有其他规则相同的规则强制使用普通类型 算术运算符。特别是,如果 a 和 b 都是int或long,结果是 与这些类型的经典除法相同的类型和价值(包括 混合输入类型的情况;
int//long
和long//int
都会 回来很久)。对于浮点输入,结果是浮点数。例如:
3.5//2.0 == 1.0
对于复数,
//
会引发异常,因为floor()
为a 不允许使用复数。对于用户定义的类和扩展类型,所有语义都取决于 类或类型的实现。
所以是的,它应该表现得那样。 “//
表示整数除法,应该返回一个整数” - 不完全,它表示分区,并且应该返回等于的内容一个整数(你总是希望(a // b).is_integer()
为真,其中任何一个操作数都是一个浮点数。)
答案 1 :(得分:-1)
我希望这可以澄清情况:
/分部
用左手操作数
分割左手操作数b / a = 2
//分区
操作数的划分,其中结果是商中的商 删除小数点后的数字。但如果其中一个操作数 如果是负的,则结果是平铺的,即从零开始舍入 (朝负无穷大)
9//2 = 4 and 9.0//2.0 = 4.0, -11//3 = -4, -11.0//3 = -4.0
https://www.tutorialspoint.com/python/python_basic_operators.htm