Python模数与余数相同?

时间:2013-10-10 01:15:41

标签: python modulo

在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一致的第一个正整数?我很困惑。

2 个答案:

答案 0 :(得分:7)

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

  • flo分裂,其中商被置于负无穷大,其余部分与除数相同。
  • 截断除法,其中商被截断为零,余数与被除数相同。
  • 欧几里德分裂,其中商被截断,无论哪个方向都留下余数为正。

所有这三个都保留了整数除法的基本定律:

dividend = divisor * quotient + remainder

所以,三者中没有一个是“正确的”或“错误的”。*

当然,这并不能阻止人们进行圣战。 Knuth在“数学上正确”的基础上主张分裂。 Wirth认为截断分裂是因为它“不那么令人惊讶”。 Raymond Boute认为整数除法是根据欧几里得算法定义的。我不会试图解决几十年前的圣战,他们争辩说他们三个人,包括两个最重要的人,都是错的......

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

我们只是说Python选择了Knuth的定义,因此它的模数运算符具有除数的符号。


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

**这一点特别有趣,因为它们并不总是一致的。至少在他们被称为remmod时,rem是与div一起使用的那个,而mod是无论是地板还是欧几里德都没有当他们被称为divremremaindermod时,请与modulo一起使用...

答案 1 :(得分:0)

如果将-23除以22,则得到-23 = -2 * 22 + 21.在Python中,“余数”总是在0和除数之间(但不等于除数)。对于正除数,商和模数通常在数学中定义。在某些编程语言中,负余数用于正除数,但不用于Python。

相关问题