在我测试过的语言中,- (x div y )
不等于 -x div y
;我在 Python 中测试过 //
,在 Ruby 中测试过 /
,在 Perl 6 中测试过 div
; C has a similar behavior .
这种行为通常符合规范,因为 div
通常定义为 the rounding down of the result of the division , 但是从算术的角度来看它并没有多大意义,因为它使 div
根据符号以不同的方式表现,并导致混淆,例如 this post on how it is done in Python .
这个设计决定背后是否有一些特定的理由,或者只是 div
从头开始定义的?显然 Guido van Rossum uses a coherency argument在一篇博客文章中解释了它是如何在 Python 中完成的,但如果你选择四舍五入,你也可以拥有一致性。
最佳答案
理想情况下,我们希望有两个操作 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),并允许 %
返回负数。相干地,整数除法向零舍入。 Java、Scala、Pascal 和 C,从 C99 开始,也采用这种策略。
关于python - 为什么整数除法在许多脚本语言中舍入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50433446/