为什么Number()以非常大的整数返回错误的值?

时间:2016-03-01 16:01:17

标签: javascript

Number()函数在某些参数上返回不正确的值,如下所示:

Number('10000000712224641') returns 10000000712224640
Number('10000000544563531') returns 10000000544563532

我在Firefox,Chome,IE和Node.js上测试了这个。为什么会这样?

3 个答案:

答案 0 :(得分:8)

JavaScript安全地支持大约17位数字,所有数字,无论是浮点数还是整数,都以64位IEEE-754二进制浮点表示。

@+id/total_text_view

当你超过这个数字时,除非你有2的幂(或增加2的幂),否则尾随数字会被舍入。

Number.MAX_SAFE_INTEGER // 9007199254740991

答案 1 :(得分:7)

Javascript uses 64-bit IEEE-754 binary floating point to store all numbers - 例如C#和Java中的double。存储整数的类型不同。 (实际实现可能会使用优化来避免始终以这种方式执行算术,但从最终用户的角度来看,结果总是,好像每个数字都被视为64位二进制浮点值。)

这意味着只有52位可用于存储有效位数,其他位用于指数和符号。通过规范化,这意味着您可以有效地存储53个精确位的值。这意味着超过2 53 -1(这是其他答案中引用的值9007199254740991),“相邻”数字之间的距离大于1,因此您无法准确存储所有整数。 / p>

答案 2 :(得分:2)

这是因为javascript支持多个数字。可能的最大安全整数存储在一个名为MAX_SAFE_INTEGER的常量中,该常量包含值9007199254740991。