在C#和Excel中模数如何不同?

我正在试验负面的数字系统,我使用Excel来玩和检查我的计算。

我注意到在C#和Excel中有区别。 为什么C#返回与Excel不同的结果?

例如:

C#:146%-3 = 2

Excel:mod(146,-3)= -1

正如维基百科文章所说,模运算是dividenddivisor == remaining 。 当任何一个操作数都是负值时,问题就来了。 在那个时候,天真的math定义被打破,结果变得依赖于实现。

在Excel中, mod运算符总是返回与除数相同符号的结果。 在math上,模运算中使用的商向下舍入(朝-∞)。 在伪代码中:

 quotient = floor(dividend / divisor) mod = dividend - (divisor * quotient) 

因此,对于146和-3:

 quotient = -49 // floor(146 / -3) mod = -1 // 146 - (-3 * -49) == 146 - 147 

在C#中,情况恰恰相反:结果总是和红利有相同的符号。 这是因为商被截断为0.在伪代码中:

 quotient = truncate(dividend / divisor) mod = dividend - (divisor * quotient) 

因此:

 quotient = -48 // truncate(146 / -3) mod = 2 // 146 - (-3 * -48) == 146 - 144 

假设我们有四个整数:x,y,q和r

  q = x / y r = x - q * y 

我希望商家和剩下的人有这个关系是有道理的。

现在我们来看看C#和Excel的区别。 不同之处在于分工 ,而不是其余部分。 当计算两个整数的商时,C#向零递减,并且Excel向下舍入。 也就是说,C#8 / -3是-2,在excel中,INT(8 / -3)是-3。

从这个事实,你可以推断为什么余下的不同。