以下是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
答案 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
的值有两个选择 - 一个为正,一个为负。不同的编程语言就是否采取正面或负面的方式做出不同的决定。您将在该页面上找到一个表格,其中总结了不同语言的作用:
r
相同的符号选择n
(这是您在上面看到的)。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