2017-07-31 91 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算法进行计算,您都应始终声明输入以确保计算仅在您确定时才返回值可以提供正确的价值。否则,对于任何不了解其有效范围的人来说,您的实施变得不可靠。否则,返回一个异常消息,该消息明确指出哪些输入或输入组合是问题以及原因。