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

詹姆斯·唐纳利(James Donnelly):

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

Number.MAX_SAFE_INTEGER

注意的值Number.MAX_SAFE_INTEGER是最大的整数n,使得nn + 1都可以精确地表示为一个Number值。

Number.MAX_SAFE_INTEGERIS 9007199254740991 (2^53−1)

ECMAScript语言规范

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为什么不这样做会使值不安全

亚历克斯·K:

我说这Math.pow(2, 53)因为,虽然它是最大的可直接表示的整数,但它的不安全之处在于它也是表示该值的第一个值也是另一个值的近似值:

9007199254740992 == 9007199254740993 // true

Math.pow(2, 53) - 1

9007199254740991 == 9007199254740993 // false

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么4不是Number的实例?

为什么<?扩展Number>对Integer不起作用?

为什么IntegerProperty实现Property <Number>而不实现Property <Integer>?

为什么数字不是typeof和instanceof的Number实例?

为什么List <Number>不是List <Object>的子类型?

为什么`keyof T` 给出`string | number` 而不是键的枚举?

为什么即使Integer扩展Number,也不能用List <Integer>不能调用List <Number>?

为什么是输出 9?

为什么Java中的Number类不是接口而不是Abstract类?

为什么列表<地图<?扩展数,?extends Number>> 不适用于 List<Map<Integer,Double>>

为什么我不能使用常数而不是this.item.number?

为什么 BigInt 不是构造函数,不像 Number、Boolean 和 String?

为什么用Number.MAX_VALUE 1.7976931348623157e + 308而不是9007199254740992e + 1024?

为什么pkill返回-9?

为什么 pkill 返回 -9?

为什么pkill返回-9?

为什么是“ &&”而不是“&”?

为什么使用'='而不是':='?

为什么“ List <?super Integer> myList”作为方法中的参数可以接受ArrayList <Number> numberList = new ArrayList <>();

为什么在PHP / .NET CMS中所有页面都是使用?id = <number>而不是直接使用php页面构建的

Java算术:为什么它们不是“ 9 = 9”?

在TS中,为什么number [] [number] ===数字?

Java-为什么要打印“ 007F”?

为什么安装时pip版本不是9?

为什么DISTINCT COUNT()返回9而不是1?

为什么计划9使用“ snarf”而不是“ copy”?

为什么glDrawElements()不是画什么?

为什么max比排序慢?

为什么构造Instance <Integer>而不是int