模 - 计算错误
Modulo - calculations error
让我简短一点。我正在尝试计算
alert((Math.pow(7,35))%71)
但它给了我 61,而结果必须是 70。怎么了?
您使用的号码太大 javascript。 int 的最大大小为 2^53——小于 7^35。
正如其他人之前提到的关于使用 Math.pow(7,35)
的那样,这个结果数字太大 Javascript 无法处理。
要解决您的问题,您需要使用外部 javascript 库。
(或者自己写 ;) )
这里有一些 Javascript 库处理大数字的例子。
希望对您有所帮助。
唯一需要更高精度的值是中间结果。因此,当您的算法不需要有问题的中间结果时,也可以在不需要更高精度变量的情况下避免该问题。
以下公式对此很有用:
(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 一个异常,并带有一条消息,清楚地说明问题是哪个输入或输入组合以及原因。
让我简短一点。我正在尝试计算
alert((Math.pow(7,35))%71)
但它给了我 61,而结果必须是 70。怎么了?
您使用的号码太大 javascript。 int 的最大大小为 2^53——小于 7^35。
正如其他人之前提到的关于使用 Math.pow(7,35)
的那样,这个结果数字太大 Javascript 无法处理。
要解决您的问题,您需要使用外部 javascript 库。 (或者自己写 ;) )
这里有一些 Javascript 库处理大数字的例子。
希望对您有所帮助。
唯一需要更高精度的值是中间结果。因此,当您的算法不需要有问题的中间结果时,也可以在不需要更高精度变量的情况下避免该问题。
以下公式对此很有用:
(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 一个异常,并带有一条消息,清楚地说明问题是哪个输入或输入组合以及原因。