【发布时间】:2018-08-01 00:44:44
【问题描述】:
我试图重复一个字符 N 次,结果遇到了Math.pow 函数。
但是当我在控制台中使用它时,结果对我来说没有任何意义:
Math.pow(10,15) - 1 提供正确的结果 999999999999999
但是为什么Math.pow(10,16) - 1 提供10000000000000000?
【问题讨论】:
标签: javascript pow
我试图重复一个字符 N 次,结果遇到了Math.pow 函数。
但是当我在控制台中使用它时,结果对我来说没有任何意义:
Math.pow(10,15) - 1 提供正确的结果 999999999999999
但是为什么Math.pow(10,16) - 1 提供10000000000000000?
【问题讨论】:
标签: javascript pow
您生成的结果超过了Number.MAX_SAFE_INTEGER 值,因此它们不再准确到单位。
这与 JavaScript 使用 64 位浮点表示数字这一事实有关,因此实际上您只有大约 16 位(十进制)精度。
由于在 EcmaScript 中引入了BigInt,您可以使用该数据类型获得准确的结果,尽管它不能与Math.pow 结合使用。相反,您可以使用 ** 运算符。
看看 number 和 bigint(带有n 后缀)的使用有何不同:
10 ** 16 - 1 // == 10000000000000000
10n ** 16n - 1n // == 9999999999999999n
【讨论】:
与许多其他编程语言不同,JavaScript 没有定义不同类型的数字,如整数、短整数、长整数、浮点数等。
JavaScript 数字始终按照国际 IEEE 754 标准存储为双精度浮点数。
这种格式以 64 位存储数字,其中数字(小数)存储在 0 到 51 位,指数存储在 52 到 62 位,登录位 63:
整数(没有句点或指数符号的数字)精确到 15 位。
【讨论】: