在我的一项任务中,我遇到了一个奇怪的实现,我很好奇这是一个bug还是设计的行为。
在Python3中,/的除法返回一个浮点数,而//表示整数除法,并且应该返回一个整数。不过,我发现,如果在进行整数除法时,任何一个值都是浮点数,那么它将返回一个浮点数。
示例:
# 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这应该是这样吗?如果是这样的话,为甚麽会这样呢?
发布于 2018-03-14 16:23:31
来自佩普-238,它引入了新的部门(强调地雷):
地板划分的语义 地板划分将在所有Python数值类型中实现,并具有以下语义: A // b ==地板(a/b) 但结果类型将是在操作之前胁迫a和b的公共类型。 具体来说,如果
a//ba和 b 属于同一类型,则E 211E 115也将属于该类型。E 216如果输入类型不同,则首先使用所有其他算术运算符使用的相同规则强制将它们强制为公共类型。 特别是,如果a和b都是int或long,则结果具有与这些类型的经典除法相同的类型和值(包括混合输入类型的情况;int//long和long//int都将返回long)。 用于浮点输入,其结果是浮点数。例如,: 3.5//2.0 == 1.0 对于复数,//会引发异常,因为不允许复数的floor()。 对于用户定义的类和扩展类型,所有语义都取决于类或类型的实现。
所以是的,它的行为应该是这样的。"__//表示整数除法并应该返回整数“--不完全是,它意味着地板除法,并且应该返回与整数相等的内容(在任何一个操作数都是浮点数的情况下,您总是期望(a // b).is_integer()为真)。
发布于 2018-03-14 16:27:46
我希望这能澄清情况:
/部门 将左手操作数除以右手操作数 B/a=2 //楼层司 运算数的除法,其中结果是去掉小数点后的数字的商。但是,如果其中一个操作数为负,则结果是泛泛的,即从零(向负无穷远)舍入。 9/2=4和9.0//2.0 = 4.0,-11//3 = -4,-11.0//3 = -4.0
https://stackoverflow.com/questions/49282799
复制相似问题