我正在试验负基数系统,我使用Excel来玩和检查我的计算。
我注意到C#与Excel之间存在差异。为什么C#返回与Excel不同的结果?
例如:
C#:146 % -3 =2
Excel:国防部(146,-3) = -1
发布于 2016-02-14 16:19:29
正如维基百科文章所述,模块操作是股息%除数==余数。当操作数中的任一为负值时,就会出现问题。在这一点上,天真的数学定义崩溃,结果成为实现依赖的。
在Excel中,mod运算符总是以与除数相同的符号返回结果。从数学上讲,模运算中使用的商数向下四舍五入(朝向−∞)。在伪码中:
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发布于 2016-02-14 16:16:56
假设我们有四个整数: x,y,q和r,使得
q = x / y
r = x - q * y 我希望商数和余数必须有这种关系是有道理的。
现在我们来看看C#和Excel的不同之处。区别实际上在于除法,而不是余数。当计算两个整数的商数时,C#舍入为零,而Excel舍入。也就是说,在C# 8/ -3 is -2中,在excel中INT(8 / -3) is -3。
从这个事实,你可以推断为什么剩下的是不同的。
https://stackoverflow.com/questions/35393745
复制相似问题