C#中模运算符(%)在不同的.NET版本为什么会有不同结果?

本文由 伯乐在线 - EluQ 翻译自 stackoverflow。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。

我对用户的输入做加密,以生成密码字符串。但是其中一行代码在不同的框架下给出了不同的结果。这是含有用户按键的值的部分代码。

按键:1。变量ascii码是49。计算后’e’和’n’的值:

1
2
3
4
e = 103,
n = 143,
Math.Pow(ascii, e) % n

上述代码的结果:

  • 在.NET3.5(C#)

1
Math.Pow(ascii, e) % n

值是9.0

  • 在.NET4(C#)

1
Math.Pow(ascii, e) % n

值是77.0

Math.Pow()在两个版本中给出了正确的(相同的)的结果。

这是什么原因造成的,或者有解决办法吗?

最佳回答:

Math.Pow 是针对双精度浮点型数值的;因此,你不应期望超过结果第一个15-17位是准确无误的:

所有的浮点型数值也有一个有限的有效位数,这个位数也决定了浮点型值是如何如实地接近真实值。一个双精度值有多达15位的十进制精度,但内部支持最多17位数。

但是,模运算需要所有的数位都是精确的。在你的程序中,你计算了49103,这个结果由175位数组成,使得模运算在你的答案中都没有意义。

为了计算出正确的值,你应该使用高精度计算,这由BigInteger类提供(.NET 4.0引入)。

编辑修正:正如下面评论中Mark Peters指出的,你应该使用BigInteger.ModPow方法, 它正是用来处理这类运算的:

1
int val = ( int )BigInteger.ModPow(49, 103, 143);   // gives 114



原文链接: stackoverflow   翻译: 伯乐在线 - EluQ
译文链接: http://blog.jobbole.com/61444/

你可能感兴趣的:(C#,模运算符)