让我们进行基本的算术运算 -模
根据不同的语言,我得到不同的输出。
Python
>>> -1 % 12
11
C#
var res = -1 % 12;
output: res = -1
为什么我会看到这种行为?理想情况下,我希望两种情况下的输出都是11。
还有谁知道我是否可以在 C# 中实现这一点?
问题的前提是不正确的。C# 中的%
运算符不是模运算符,而是余数运算符,而 Python中的运算符是模运算符。
正如Eric Lippert 所描述的,模数和余数对于所有正数都是相同的,但它们处理负数的方式不同。
尽管 C# 和 Python 都有一个%
运算符,但这并不意味着它们都代表一个模数。
值得注意的是,其他语言(例如 C++ 和 Java)使用余数作为%
运算符,而不是模数,这可能是 C# 选择使用余数的原因。由于运算符的含义没有很多一致性%
,因此我建议在使用新语言时在语言文档中查找它。
在 Python 中,%
运算符返回与除数相同的符号。在 C# 中,它返回与被除数相同的符号。(另见模运算符)
在 Python 中,math.fmod
会给出与 C# 类似的结果。
如果你想11
在 C# 中获取,你可能需要说:
(((-1 % 12) + 12) % 12)
其他人已经解释了为什么你在两种语言中得到不同的结果,但重要的是要认识到这两个答案都是正确的,因为当你反转操作时,你会得到原始数字。
在 C# 中,整数除法的结果-1 / 12
是0
. 0 * 12
是0
。要回到原来的-1
,您需要添加-1
,这是您在余数操作中得到的。
在 Python 中,-1 / 12
是-1
. -1 * 12
是-12
。要回到原来的状态-1
,您需要添加11
. 这又是你得到的模数。
因此,这不仅仅是运算%
执行的不同,当两种语言的操作数符号不同时,整数除法的执行方式也不同。选择的行为,%
使得商乘以除数并加到余数,得到被除数。改变商的计算方式必然会改变余数的计算方式。