Math.pow 给出了错误的结果

Math.pow gives wrong result

我试图将一个字符重复 N 次,然后遇到了 Math.pow 函数。

但是当我在控制台中使用它时,结果对我来说没有任何意义:

Math.pow(10,15) - 1 提供正确的结果 999999999999999

但为什么 Math.pow(10,16) - 1 提供 10000000000000000

您正在生成超过 Number.MAX_SAFE_INTEGER 值的结果,因此它们不再准确到单位。

这与 JavaScript 对数字使用 64 位浮点表示有关,因此实际上您只有大约 16 位(十进制)精度。

由于在 EcmaScript 中引入了 BigInt,您可以使用该数据类型获得准确的结果,尽管它不能与 Math.pow 结合使用。相反,您可以使用 ** 运算符。

查看 number 和 bigint(带有 n 后缀)的用法有何不同:

10  ** 16  - 1  // == 10000000000000000
10n ** 16n - 1n // ==  9999999999999999n

与许多其他编程语言不同,JavaScript 不定义不同类型的数字,如整数、短整数、长整数、floating-point 等

JavaScript 数字始终存储为 double-precision floating-point 数字,遵循国际 IEEE 754 标准。

此格式以 64 位存储数字,其中数字(分数)存储在位 0 到 51 中,指数存储在位 52 到 62 中,sign-in 位 63:

整数(没有句点或指数符号的数字)最多精确到 15 位。