在C#和Excel中模数如何不同?
我正在试验负面的数字系统,我使用Excel来玩和检查我的计算。
我注意到在C#和Excel中有区别。 为什么C#返回与Excel不同的结果?
例如:
C#:146%-3 = 2
Excel:mod(146,-3)= -1
正如维基百科文章所说,模运算是dividend % divisor == 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。
从这个事实,你可以推断为什么余下的不同。