一个数的模数 - python vs c#

时间:2013-08-07 14:30:35

标签: c# python

让我们进行基本的算术运算 - modulo

根据不同的语言,我得到不同的输出。

的Python

>>> -1 % 12
11

C#

var res = -1 % 12;
output: res = -1

为什么我会看到这样的行为?理想情况下,我希望两种情况下的输出都是 11

也有人知道我是否可以在C#中实现这一目标吗?

3 个答案:

答案 0 :(得分:10)

问题的前提是不正确的。 C#中的%运算符不是模运算符,它是余数运算符,而在Python中,模运算符。

作为Eric Lippert Describes,所有正数的模数和余数都相同,但它们以不同的方式处理负数。

尽管C#和Python都有%运算符,但并不意味着它们都代表模数。

值得注意的是,其他语言(如C ++和Java)使用%运算符的余数,而不是模数,这可能有助于C#选择使用余数的原因。由于%运算符的含义不是很一致,因此我建议您在使用新语言时在语言文档中进行查找。

答案 1 :(得分:2)

在Python中,%运算符返回与除数相同的符号。在C#中,它返回与被除数相同的符号。 (另见Modulo operator

在Python中,math.fmod会给C#提供类似的结果。

如果你想在C#中获得11,你可能需要说:

(((-1 % 12) + 12) % 12)

答案 2 :(得分:0)

其他人已经解释了为什么你在两种语言中得到不同的结果,但重要的是要意识到这两个答案都是正确的,因为当你颠倒操作时,你会得到原来的号。

在C#中,整数除法-1 / 12的结果为00 * 120。要返回到原来的-1,您需要添加-1,这是剩余操作的结果。

在Python中,-1 / 12-1-1 * 12-12。要返回原始-1,您需要添加11。这也是你得到的模数。

因此,不仅仅是操作%执行的差异,在两种语言的操作数符号不同时执行整数除法的区别。选择%的行为,使商,乘以除数,并加到余数中,得到被除数。更改商的计算方式必然会改变计算余数的方式。