在Python文档中,它说“The % (modulo) operator yields the remainder from the division of the first argument by the second.

因此给定

a % b

据我所知,余数是A除以B剩下的数字。因此21%3 = 0,而-25%23 = -2。
我不明白的是,当A为负数时会发生什么。

例如,
-23 % 22

会屈服
21

这是第一个正整数,取模-1。但是-1是-23%的余数22.那么文档是否错误? Python中的模运算符%不会在%b中产生余数,而是产生与B取模完全相同的第一个正整数。我很困惑。

最佳答案

定义负数的整数除法有三种不同的明显方法,以及定义余数的三种对应的方法:

  • 底数除法,其中商的底数为负无穷大,余数与除数的符号相同。
  • 截断除法,其中商被截断为零,余数与除数相同。
  • 欧几里得除法,其中商在任何方向都被截断而余数为正。

  • 所有这三个都保留了整数除法的基本定律:
    dividend = divisor * quotient + remainder
    

    因此,这三个都不是“对”或“错”。*

    当然,这并不能阻止人们进行圣战。克努斯(Knuth)主张以“数学上正确的”为基础进行底数划分。维尔斯(Worth)主张截断 split ,因为这“不足为奇”。雷蒙德·布特(Raymond Boute)认为整数除法是根据欧几里得算法定义的。我不会试图通过争论他们三个人,包括该领域最重要的两个人,来解决数十年的圣战……

    一些语言通过具有两种不同的功能来解决此问题。**

    我们只说Python接受了Knuth的定义,所以它的模运算符具有除数的符号。

    *当然,选择商和余数的不匹配定义是另一回事。或者,更糟的是,像C在C99之前所做的那样,指定一个并保留另一个实现定义。

    **这特别有趣,因为它们并不总是一致地确定哪个是哪个。至少当它们分别被称为remmod时,rem是与div一起使用的,而mod是无底的或Euclidean不与div一起使用的,当它们分别被称为remremaindermodmodulo时……

    关于Python模数与余数相同吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19285497/

    10-11 06:38