python - 为什么整数除法在许多脚本语言中舍入?

标签 python ruby raku integer-division

在我测试过的语言中,- (x div y ) 不等于 -x div y;我在 Python 中测试过 //,在 Ruby 中测试过 /,在 Perl 6 中测试过 divC 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 中完成的,但如果你选择四舍五入,你也可以拥有一致性。

(受 this question by PMurias in the #perl6 IRC channel 启发)

最佳答案

理想情况下,我们希望有两个操作 divmod , 满足, 对于每个 b>0 :

  1. (a div b) * b + (a mod b) = a
  2. 0 <= (a mod b) < b
  3. (-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/

相关文章:

python - 在不同的包中编译具有依赖关系的pyx文件

ruby-on-rails - 尝试从外部 URL 检索数据时出现错误消息

Ruby 输出不显示在 sinatra 浏览器上

raku - Raku 中 (Any) 的含义是什么 - 特别是 ()?

Raku 控制语句使数字字符串解释为数字

python - 如果扭曲繁忙,如何监听另一个端口

python - AgeRange 不在 Rekognition 响应中

语法正则表达式独立匹配但不匹配

Python、Mac OS X NSUserNotification、操作按钮

ruby-on-rails - 何时考虑在 Rails 应用程序中创建自己的 Ruby 模块?