为什么 %(模、余数)运算符在 Python 和 C# 中对负操作数返回不同的结果?

问题描述 投票:0回答:3

今天我正在用 C# 编写一个程序,我使用

%
来计算一些索引...我的程序不起作用,所以我调试了它,我意识到
%
不像其他程序语言那样工作我知道。

例如:

在 Python 中

%
返回如下值:

for x in range(-5, 6):
     print(x, "% 5 =", x % 5)
-5 % 5 = 0
-4 % 5 = 1
-3 % 5 = 2
-2 % 5 = 3
-1 % 5 = 4
0 % 5 = 0
1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
4 % 5 = 4
5 % 5 = 0

在 C# 中:

for (int i = -5; i < 6; i++)
{
    Console.WriteLine(i + " % 5 = " + i % 5);
}

输出:

-5 % 5 = 0
-4 % 5 = -4
-3 % 5 = -3
-2 % 5 = -2
-1 % 5 = -1
0 % 5 = 0
1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
4 % 5 = 4
5 % 5 = 0

我做错了什么或者

%
没有像它应该的那样工作吗?

c# math operators modulo
3个回答
20
投票

正如评论中所解释的,不同的行为是设计使然的。不同的语言只是赋予

%
运算符不同的含义。

你问:

如何在 C# 中使用模运算符?

您可以自己定义一个模数运算符,其行为与 Python

%
运算符相同:

int mod(int a, int n)
{
    int result = a % n;
    if ((result<0 && n>0) || (result>0 && n<0)) {
        result += n;
    }
    return result;
}

10
投票

两个答案都是正确的。虽然我个人认为“永远积极”更有意义。

您可以定义自己的模函数,它只给出肯定的答案,如下所示:

int mod(int a, int n) {
    return ((a%n)+n) % n;
}

7
投票

模算术中,人们根据模定义数字的。换句话说,在模m算术中,数字n相当于(读作:相同)n + mn - mn + 2m n - 2m

一个定义了 m“篮子”,每个数字都落入其中一个(且只有一个)中。

示例:可以说“现在是下午 4:30”,也可以说“现在是 16:30”。两种形式表示的时间完全相同,但其表示不同。

因此,Python 和 C# 结果都是正确的!您选择的模 5 算术中的数字是“相同”的。例如,返回 (5, 6, 7, 8, 9) 也是“数学上”正确的。只是有点奇怪。 至于表示的选择(换句话说,如何表示负数的选择),这只是两种语言之间不同设计选择的情况。 但是,这根本不是 % 运算符在 C# 中实际执行的操作。 % 运算符不是规范模数运算符;它是余数运算符。 A % B 运算符实际上回答了“如果我使用整数算术将 A 除以 B,余数是多少?”的问题

有什么区别?余数与模数

作者:Eric Lippert

获取规范模数的快速片段: return ((n % m) + m) % m;


测试实施:

单声道/C#

machine:~ user$ cat mod.cs using System; public class Program { public static void Main (string[] args) { Console.WriteLine(Mod(-2, 5)); Console.WriteLine(Mod(-5, 5)); Console.WriteLine(Mod(-2, -5)); } public static int Mod (int n, int m) { return ((n % m) + m) % m; } } machine:~ user$ mono mod.exe 3 0 -2

Python


machine:~ user$ cat mod.py print -2%5; print -5%5; print -2%-5; machine:~ user$ python mod.py 3 0 -2

© www.soinside.com 2019 - 2024. All rights reserved.