C#中模運算子(%)在不同的.NET版本為什麼會有不同結果?

EluQ發表於2014-03-18

我對使用者的輸入做加密,以生成密碼字串。但是其中一行程式碼在不同的框架下給出了不同的結果。這是含有使用者按鍵的值的部分程式碼。

按鍵:1。變數ascii碼是49。計算後’e’和’n’的值:

上述程式碼的結果:

  • 在.NET3.5(C#)

值是9.0

  • 在.NET4(C#)

值是77.0

Math.Pow()在兩個版本中給出了正確的(相同的)的結果。

這是什麼原因造成的,或者有解決辦法嗎?

最佳回答:

Math.Pow 是針對雙精度浮點型數值的;因此,你不應期望超過結果第一個15-17位是準確無誤的:

所有的浮點型數值也有一個有限的有效位數,這個位數也決定了浮點型值是如何如實地接近真實值。一個雙精度值有多達15位的十進位制精度,但內部支援最多17位數。

但是,模運算需要所有的數位都是精確的。在你的程式中,你計算了49103,這個結果由175位陣列成,使得模運算在你的答案中都沒有意義。

為了計算出正確的值,你應該使用高精度計算,這由BigInteger類提供(.NET 4.0引入)。

編輯修正:正如下面評論中Mark Peters指出的,你應該使用BigInteger.ModPow方法, 它正是用來處理這類運算的:

 

相關文章