理想情况下,我们希望有两个操作div
和mod
,满足每个b>0
:
(a div b) * b + (a mod b) = a
0 <= (a mod b) < b
(-a) div b = -(a div b)
然而,这在数学上是不可能的。如果以上所有条件都成立,那么我们将会得到:
1 div 2 = 0
1 mod 2 = 1
由于这是方程(1)和(2)的唯一整数解。因此,根据(3),我们也有
0 = -0 = -(1 div 2) = (-1) div 2
由(1)可推出
-1 = ((-1) div 2) * 2 + ((-1) mod 2) = 0 * 2 + ((-1) mod 2) = (-1) mod 2
使得 (-1) mod 2 < 0
,与 (2) 相矛盾。
因此,我们需要放弃 (1),(2) 或 (3) 中的某些属性。
有些编程语言放弃了 (3),并且使 div
向下取整 (如 Python、Ruby)。
在一些(罕见的)情况下,语言提供多个除法运算符。例如,在 Haskell 中,我们有 div,mod
只满足 (1) 和 (2),类似于 Python;还有 quot,rem
只满足 (1) 和 (3)。后面一组操作符将除法向零舍入,但付出的代价是返回负余数,例如,我们有 (-1) `quot` 2 = 0
和 (-1) `rem` 2 = (-1)
。
C# 也放弃了 (2),并允许 %
返回负余数。一致地,整数除法向零舍入。从 C99 开始,Java、Scala、Pascal 和 C 也采用了这种策略。
.7 // .1
。请注意,它不会评估为“int”。 - PM 2Ring-(-23 // 10)
。 - PM 2Ring