为什么整数除法会返回浮点数?

8
据我所知,整数除法运算符//保证返回一个整数。然而,尽管2 // 1 == 1,但我也得到了2.0 // 1 == 2.0。为什么Python不产生一个整数,而且将输出转换为int总是安全的吗?

2.0 // 1 不是整数除法,而是将浮点数除以整数(向下取整)。整数除法应该是 2 / 1 或者 2 // 1。无论结果是整数还是浮点数,如果我按照“整数除法”这个字面意思来理解,那么对我来说它的意思就是“一个整数被另一个数除”或者“一个整数被另一个整数除”。我想你可能把它看作“一个数被整数除”,但是当涉及到语句中的两种不同类型时,需要强制其中一种类型与另一种类型配合使用。因此,在这种情况下,我认为整数除法要求两个数字都必须是整数。 - SteveExdia
1个回答

11

您误解了操作符。它是“floor division”(向下取整除法)运算符,而不是整数除法运算符。

对于浮点数输入,它仍将返回一个向下取整的浮点值。

来自二元算术运算章节

/(除法)和 //(向下取整除法)运算符会产生它们参数的商。首先,数值参数会被转换为一个公共类型。对整数进行除法运算会产生一个浮点数,而对整数进行向下取整除法运算则会产生一个整数;结果是应用于该结果的“floor”函数的数学除法的结果。

向下取整的结果可以安全地转换成整数。

请注意,Python 在几乎所有数字类型在二元算术运算中都适用这些规则,除法和向下取整除法也不例外,并且这与整数和浮点数无关(例如,尝试使用 import fractions 然后执行 2 // fractions.Fraction(1, 1))。唯一的例外是复数,对于复数,向下取整除法、取模运算或 divmod() 未定义。


我想知道在这种情况下返回一个向下取整的浮点数的用例是什么。如果我猜的话,可能是为了与 1+1 == 21. + 1 == 2. 保持一致。 - Charlie G
1
@CharlieG:因为它与使用不同数字类型的其他数学运算一致。这不仅限于整数和浮点数,还适用于布尔值、decimal.Decimal()fractions.Fraction()所有两个数字之间的二进制算术运算都会将这些数字转换为一个公共类型(对于复数有一些例外情况,因为数学运算没有任何意义)。 - Martijn Pieters
我想知道浮点数除法的结果有多“稳定”。我应该发一个新问题吗?例如,考虑以下代码:d = defaultdict(list); for x in [3.0, 7.1, 12.6, 15.4]: d[x // 10.0].append(x)。我能保证数字会被正确分组为 {0.0: [3.0, 7.1]; 10.0: [12.6, 15.4]} 吗?还是说 12.6 // 10.015.4 // 10.0 存在不精确相等的风险? - Stef
1
@Stef:浮点数除法完全是确定性的,不是随机的,也不依赖于任何变量参数,并且您正在使用浮点数的字面值。结果不会有任何变化。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接