4

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

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

Python

>>> -1 % 12
11

C#

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

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

还有谁知道我是否可以在 C# 中实现这一点?

4

3 回答 3

14

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

正如Eric Lippert 所描述的,模数和余数对于所有正数都是相同的,但它们处理负数的方式不同。

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

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

于 2013-08-07T14:35:01.867 回答
2

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

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

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

(((-1 % 12) + 12) % 12)
于 2013-08-07T14:50:13.073 回答
1

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

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

在 Python 中,-1 / 12-1. -1 * 12-12。要回到原来的状态-1,您需要添加11. 这又是你得到的模数。

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

于 2013-08-07T15:49:21.667 回答