日期:2014-05-18  浏览次数:21114 次

C#求余问题
最近在研究编码转换,用到求余运算,发现一个有意思的bug,用C#自带的求余运算和微软自带的计算机求余运算的结果竟然不同,例如:
C#运算Math.Pow(34,103) % 143 =75
计算机运算(34^103)mod 143 =120
哪位大神知道两种运算方式的差别在哪?

------解决方案--------------------
取模运算没什么精度的问题,只有对或不对

Math.Pow进行的浮点数运算,区模进行的是整数运算
Pow的结果会被转换为int,问题是早就溢出了。所以你的结果肯定不对

如果你真有这种需求,可以自己写个这样的函数进行精确计算

[code=C#] public int ModAfterPow(int b, int e, int m)
{
int t = 1;
for (int i = 0; i < e; i++) {
t = t * b;
t = t % m;
}

return t;
}

public override void Run()
{
Console.WriteLine(ModAfterPow(34, 103, 143));
}
[code]