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 位。
我试图将一个字符重复 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 位。