Number()函数在某些参数上返回不正确的值,如下所示:
Number('10000000712224641') returns 10000000712224640
Number('10000000544563531') returns 10000000544563532
Run Code Online (Sandbox Code Playgroud)
我在Firefox,Chome,IE和Node.js上测试了这个.为什么会这样?
JavaScript安全地支持大约17位数字,所有数字,无论是浮点数还是整数,都以64位IEEE-754二进制浮点表示.
Number.MAX_SAFE_INTEGER // 9007199254740991
Run Code Online (Sandbox Code Playgroud)
当你超过这个数字时,除非你有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)
Run Code Online (Sandbox Code Playgroud)
Javascript使用64位IEEE-754二进制浮点来存储所有数字 - 例如,double在C#和Java中.存储整数的类型不同.(实际实现可能会使用优化来避免始终以这种方式执行算术,但从最终用户的角度来看,结果总是好像每个数字都被视为64位二进制浮点值.)
这意味着只有52位可用于存储有效位数,其他位用于指数和符号.通过规范化,这意味着您可以有效地存储53个精确位的值.这意味着超过2 53 -1(这是其他答案中引用的值9007199254740991),"相邻"数字之间的距离大于1,因此您无法准确存储所有整数.