2016-11-11 2 views
3

parseIntを通過する際の数値が他の数値に変更されています。JSON構文解析により特定の数値がsomethigに変換されます

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での作業や数は、結果の数値を変更しているとJSONにstrを変えました。 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

関連する問題