7

Below is some code in C++. If you try something like -2%5 in python the result is positive 3 while many other languages like c++ C# (code) and flash give -2

Why do they give -2 and is one version more correct than the other?

#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);
}

Output:

2
-2
-2
2
-2
4

3 回答 3

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 选择与(在 2011 标准之前,它的实现定义)r相同的符号。a

如果你想确保你在 Python 中得到正面的,使用这个:

r = a % n
if r < 0:
  r += n
于 2012-02-17T08:32:14.483 回答
2

根据 C++文档

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

这似乎很奇怪。Python文档仅说明了这一点:

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

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

于 2012-02-17T08:32:01.620 回答
-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
于 2012-02-17T08:31:46.237 回答