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

7 c++ python modulus

下面是C++中的一些代码.如果你-2%5在python中尝试类似的结果是积极的3,而许多其他语言如c ++ C#(代码)和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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

2
-2
-2
2
-2
Run Code Online (Sandbox Code Playgroud)

tho*_*att 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
Run Code Online (Sandbox Code Playgroud)


Mar*_*cin -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
Run Code Online (Sandbox Code Playgroud)