模 - 计算错误

Modulo - calculations error

让我简短一点。我正在尝试计算

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

但它给了我 61,而结果必须是 70。怎么了?

您使用的号码太大 javascript。 int 的最大大小为 2^53——小于 7^35。

正如其他人之前提到的关于使用 Math.pow(7,35) 的那样,这个结果数字太大 Javascript 无法处理。

要解决您的问题,您需要使用外部 javascript 库。 (或者自己写 ;) )

这里有一些 Javascript 库处理大数字的例子。

  1. BigNum
  2. Bignumber

希望对您有所帮助。

唯一需要更高精度的值是中间结果。因此,当您的算法不需要有问题的中间结果时,也可以在不需要更高精度变量的情况下避免该问题。
以下公式对此很有用: (a.b) % 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

但是您可能需要对可变的整数执行此操作(否则,您可以通过对结果进行硬编码来避免该问题)。 因此,您需要了解可以预期的值范围,并定义一种算法,将功率计算拆分成多个部分,当输入在预期范围内时,这些部分的结果总是足够小。

无论您选择像这样的计算,使用更高精度的变量(使用专门的库)或专门的算法进行计算,您都应该始终断言输入以确保您的计算 return 只是一个值当您确定它可以提供正确的值时。否则,对于不知道其有效范围的任何人,您的实施将变得不可靠。否则 return 一个异常,并带有一条消息,清楚地说明问题是哪个输入或输入组合以及原因。