2016-11-11 50 views
3

我发现某些号码在通过parseInt时正在更改为其他号码。JSON解析将某些号码转换为其他

console.log(parseInt(10153315281647662, 10)); //10153315281647662 
console.log(parseInt(10153315281647663, 10)); //10153315281647664 
console.log(parseInt(10153315281647664, 10)); //10153315281647664 
console.log(parseInt(10153315281647665, 10)); //10153315281647664 
console.log(parseInt(10153315281647666, 10)); //10153315281647666 
console.log(parseInt(10153315281647667, 10)); //10153315281647668 
console.log(parseInt(10153315281647668, 10)); //10153315281647668 
console.log(parseInt(10153315281647669, 10)); //10153315281647668 
console.log(parseInt(10153315281647660, 10)); //10153315281647660 


var str = '{ "id" : 10153315281647663 }'; 
console.log( JSON.parse(str)) // id : 10153315281647664 

我与几个大的数字和parseInt工作或改变str以JSON与数量在不断变化的结果的数字。这不是因为整数堆栈溢出,因为较大的数字10153315281647666解析正确,而10153315281647663不是,这背后的原因是什么?

我已经解决了所有问题,解决了问题,但是这是什么原因?

回答

1

您尝试解析的数字太大。它can't be reliably stored为双精度浮点

console.log(10153315281647663 > Number.MAX_SAFE_INTEGER); 
 
console.log(10153315281647663); 
 
console.log(Number.MAX_SAFE_INTEGER);

+0

但结果似乎并没有被 “意外”,甚至是随机的。一些正在解析正确,有些不是,结果总是完全相同的一个给定的数字。这背后有理由吗? – developernaren

+0

@developernaren:那是因为最不重要的位丢失了。我会(尝试)添加一个解释。 – Cerbrus

+0

没有它,我不能真正拿出一个正确的解释,导致墙壁的文字。这里有更好的资源可以解释为什么你看到你看到的数字:http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html – Cerbrus

0

不需要解析它的地方最大可能数刚刚结束的数字没有松动的IEEE 754格式的精度。

console.log(10153315281647662); //10153315281647662 
 
console.log(10153315281647663); //10153315281647664 
 
console.log(10153315281647664); //10153315281647664 
 
console.log(10153315281647665); //10153315281647664 
 
console.log(10153315281647666); //10153315281647666 
 
console.log(10153315281647667); //10153315281647668 
 
console.log(10153315281647668); //10153315281647668 
 
console.log(10153315281647669); //10153315281647668 
 
console.log(10153315281647660); //10153315281647660