让我们进行基本的算术运算 - modulo
根据不同的语言,我得到不同的输出。
的Python
>>> -1 % 12
11
C#
var res = -1 % 12;
output: res = -1
为什么我会看到这样的行为?理想情况下,我希望两种情况下的输出都是 11 。
也有人知道我是否可以在C#中实现这一目标吗?
答案 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
的结果为0
。 0 * 12
是0
。要返回到原来的-1
,您需要添加-1
,这是剩余操作的结果。
在Python中,-1 / 12
为-1
。 -1 * 12
是-12
。要返回原始-1
,您需要添加11
。这也是你得到的模数。
因此,不仅仅是操作%
执行的差异,还在两种语言的操作数符号不同时执行整数除法的区别。选择%
的行为,使商,乘以除数,并加到余数中,得到被除数。更改商的计算方式必然会改变计算余数的方式。