2017-07-31 125 views
2

讓我簡單介紹一下。我試圖計算Modulo - 計算錯誤

alert((Math.pow(7,35))%71) 

但它給了我61,當結果必須是70.什麼是錯?

+5

你超出了JavaScript數字的準確性。 – Pointy

+0

有沒有解決問題的方法? –

+0

也許你可以四處尋找無限精度的定點庫。 – Pointy

回答

2

正如其他人之前提到的Math.pow(7,35這個數字對於Javascript來說太大了。

要解決您的問題,您需要使用外部JavaScript庫。 (或自己寫;))

下面是一些處理大數字的Javascript庫的例子。

  1. BigNum
  2. Bignumber

我希望它能幫助。

2

您使用的編號對於JavaScript來說太大了。 int的最大大小是2^53 - 小於7^35。

0

需要更高精度的唯一值是中間結果。因此,如果您的算法不需要有問題的中間結果,則無需更高精度的變量就可以避免該問題。
下面的公式可用於此: (ab)%c =(a%c)(b%c)%c
這意味着Math.pow(7,35)%71 =((Math.pow (7,17)%71)*(Math.pow(7,18)%71))%71.
現在中間結果較小,但可能仍然太大。所以我們需要進一步分解並將模塊運算符應用於較小的中間結果。
所以,你可以做這樣的事情: Math.pow((Math.pow(7,7)%71),5)%71

但你可能需要爲整數爲此至極的變量(否則,你可以通過對結果進行硬編碼來避免這個問題)。 因此,您需要了解您可以預期的值的範圍,並定義一個算法,將功率計算分解爲若干塊,當輸入處於預期範圍內時,結果總是足夠小。

無論您選擇如何計算,使用更高精度的變量(使用專門的庫)或specilized算法進行計算,您都應始終聲明輸入以確保計算僅在您確定時才返回值可以提供正確的價值。否則,對於任何不瞭解其有效範圍的人來說,您的實施變得不可靠。否則,返回一個異常消息,該消息明確指出哪些輸入或輸入組合是問題以及原因。