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