模数如何工作以及为什么它在Python中与大多数语言不同?

时间:2012-02-17 08:10:12

标签: c++ python modulus

以下是some code in C++。如果你在python中尝试-2%5之类的东西,结果是正3,而许多其他语言如c ++ C#(code)和flash给-2

为什么他们给-2并且一个版本比另一个更正确?

#include <cstdio>
int main(){
printf("%d\n", 2%5);
printf("%d\n", -2%5);
printf("%d\n", -2%77);
printf("%d\n", 2%-77);
printf("%d\n", -2%-77);
}

输出:

2
-2
-2
2
-2

3 个答案:

答案 0 :(得分:7)

如果r = a % n,则a = n * q + r为某些q。这意味着您可以选择r的值,具体取决于所选q的值。

我建议您阅读http://en.wikipedia.org/wiki/Modulo_operation,其中说大多数编程语言选择r -n < r < n。这意味着,除非r为零,否则r的值有两个选择 - 一个为正,一个为负。不同的编程语言就是否采取正面或负面的方式做出不同的决定。您将在该页面上找到一个表格,其中总结了不同语言的作用:

  • Python使用与r相同的符号选择n(这是您在上面看到的)。
  • C ++ 2011选择与r具有相同符号的a(在2011标准之前,它的实现已定义)。

如果你想确保在Python中得到肯定的,请使用:

r = a % n
if r < 0:
  r += n

答案 1 :(得分:2)

根据C ++ documentation

  

对于负值,结果可能会因库实施而异。

这看起来很奇怪。 Python documentation只说这个:

  

模运算符总是产生一个与第二个操作数相同符号的结果(或零);结果的绝对值严格小于第二个操作数的绝对值。

对我来说似乎,Python方式更合乎逻辑,但这只是一种直觉。

答案 2 :(得分:-1)

我认为你应该看看下面的内容。除了使用稍微不同的算法之外,运算符优先级也很重要。试试括号:

In [170]: 2%5
Out[170]: 2

In [171]: -2%5
Out[171]: 3

In [172]: (-2)%5
Out[172]: 3

In [173]: -(2%5)
Out[173]: -2