Number()函数在某些参数上返回不正确的值,比如这样:
Number('10000000712224641') returns 10000000712224640
Number('10000000544563531') returns 10000000544563532
我在Firefox、Chrome、IE和Node.js上测试了这个。为什么会发生这种情况?
Number()函数在某些参数上返回不正确的值,比如这样:
Number('10000000712224641') returns 10000000712224640
Number('10000000544563531') returns 10000000544563532
JavaScript 安全地支持约17位数字,所有数字(无论是浮点数还是整数)都以64位IEEE-754二进制浮点数表示。
Number.MAX_SAFE_INTEGER // 9007199254740991
当您超过该数字时,尾数将被四舍五入,除非您具有2的幂(或2的幂相加)
Math.pow(2, 54) // 18014398509481984 (not rounded)
Math.pow(2, 54) + 1 // 18014398509481984 (rounded)
Math.pow(2, 54) - 1 // 18014398509481984 (rounded)
Math.pow(2,57) + Math.pow(2,52) // 148618787703226370 (not rounded)
Math.pow(2, 57) + Math.pow(2, 52) + 1 // 148618787703226370 (rounded)
Math.pow(2,54)
是如何工作的,以及所有的 Math.pow(2,54) -1 === Math.pow(2,54)
和 Math.pow(2,54) + 1 === Math.pow(2,54)
。 - Ruan MendesNumber.MAX_SAFE_INTEGER
也可以精确表示,而其他数字则不行。这与你所说的有何不同? - Ruan MendesJavaScript使用64位IEEE-754二进制浮点数来存储所有数字 - 就像C#和Java中的double
一样。没有不同的类型来存储整数。(实际实现可能使用优化方式避免总是以这种方式执行算术运算,但从最终用户的角度来看,结果将始终被视为64位二进制浮点值处理。)
这意味着只有52位可用于存储有效数字,其他位用于指数和符号。通过规范化,这意味着您可以有效地存储具有53个有效位精度的值。这意味着超过2 53 -1(这是其他答案中引用的值9007199254740991),"相邻"数字之间的距离大于1,因此无法精确存储所有整数。
Smi
类型。所以像x = 3 + 2
这样的操作在内部不会涉及到浮点数。 - georg这是因为javascript支持许多数字。最大安全整数存储在一个名为MAX_SAFE_INTEGER的常量中,其值为9007199254740991。
Number.MAX_SAFE_INTEGER
的整数可以被表示,并且这是由于精度问题。 - Ruan Mendes