javascript - 为什么 Number.MAX_SAFE_INTEGER 是 9,007,199,254,740,991 而不是 9,007,199,254,740,992?

标签 javascript ecmascript-6 integer ieee-754

ECMAScript 6 的 Number.MAX_SAFE_INTEGER 应该表示 JavaScript 在出现浮点精度问题之前可以存储的最大数值。但是,要求添加到此值的数字 1 也必须可以表示为 Number

Number.MAX_SAFE_INTEGER

NOTE The value of Number.MAX_SAFE_INTEGER is the largest integer n such that n and n + 1 are both exactly representable as a Number value.

The value of Number.MAX_SAFE_INTEGER is 9007199254740991 (2^53−1).

ECMAScript Language Specification

Chrome、Firefox、Opera 和 IE11 的 JavaScript 控制台都可以安全地对数字 9,007,199,254,740,992 进行计算。一些测试:

// Valid
Math.pow(2, 53)                         // 9007199254740992
9007199254740991 + 1                    // 9007199254740992
9007199254740992 - 1                    // 9007199254740991
9007199254740992 / 2                    // 4503599627370496
4503599627370496 * 2                    // 9007199254740992
parseInt('20000000000000', 16)          // 9007199254740992
parseInt('80000000000', 32)             // 9007199254740992
9007199254740992 - 9007199254740992     // 0
9007199254740992 == 9007199254740991    // false
9007199254740992 == 9007199254740992    // true

// Erroneous
9007199254740992 + 1                    // 9007199254740992
9007199254740993 + ""                   // "9007199254740992"
9007199254740992 == 9007199254740993    // true

为什么要求 n + 1 也必须表示为 Number?为什么失败会使值不安全

最佳答案

我会说是因为 Math.pow(2, 53)是最大的可直接表示的整数,它的不安全因为它也是表示的第一个值也是另一个值的近似值:

900719925474099<b><em>2</em></b> == 900719925474099<b><em>3</em></b> // true

对比Math.pow(2, 53) - 1 :

900719925474099<b><em>1</em></b> == 900719925474099<b><em>3</em></b> // false

关于javascript - 为什么 Number.MAX_SAFE_INTEGER 是 9,007,199,254,740,991 而不是 9,007,199,254,740,992?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26380364/

相关文章:

javascript - AngularJS Bootstrap 模块按钮之间的空白

javascript - 在 es 6 中使用对象作为方法的参数

javascript - ToolbarAndroid React 原生动态字幕绑定(bind)到状态

java - 使用 double 类型时在 Java 中转换为整数

java - 卡住一个整数

javascript - 我不能在 Apache 中使用别名权限被拒绝

javascript - switch/case 语句中的 JavaScript 变量作用域是什么?

javascript - 在嵌套的对象数组中过滤

objective-c - 当我创建一个整数作为对象的 NSDictionary 时应用程序崩溃

javascript - 修改 Javascript 中通过引用传递的变量