2013-11-26 16 views
6

これは私が直面している奇妙な問題です。私は10466511635124472、代わりの10466511635124471を見ているのアラートでJava Scriptで大きな数字が表示される

<!DOCTYPE html> 
<html> 
<body> 

<p>Click the button to display an alert box.</p> 

<button onclick="myFunction()">Try it</button> 

<script> 
function myFunction() 
{ 
alert(10466511635124471); 
} 
</script> 

</body> 
</html> 

:私は値が自動的に例えば1だけインクリメント取得されたJSの機能(カスタムまたは組み込み)にいくつかの大きな番号を渡すと、これを見ます。誰かがこの行動を説明できますか?

私はFF 17.0.10でこれをチェックしているクロム12.0.742.122およびIE 8これはIEEE754 double-precision 64-bit floating point mathall compliant JavaScript implementations use this form of IEEE arithmetic)の自然と行うことです

+0

として答えを得るための理由であることnumber.Mayまし://浮動ポイント - gui.de/ – elclanrs

+0

基本的には、与えられた範囲ですべての奇数をインクリメントします。試してみます。10466511635124472正しい値を表示します。正直なところ私は理由を知らない –

+0

@Arun:必ずしもそうではない、それは誤解を招く。 –

答えて

1

- あなたの番号10 466 511 635 124連続番号として表現可能な最大の正の整数よりも大きく、2 (9 007 199 254 740 992)である。 JavaScriptの数字の64ビットは、符号の1ビット、数字の52ビット(指数の特殊な動作は実質的に53ビットの精度を作ります)と指数の11ビットを使用して表されます。これがその理由です。

数字がこの最大数を超えると、それを表すのに1より大きい指数が使用されます。その結果、可能な表現が最小限に抑えられます。 2つの指数(あなたの場合に表されている)を使用すると、数字の最小の微分可能な変化は2になり、あなたの数はこれらの2つの間にあるので、最も近いものに丸められます。

JavaScriptには任意のサイズの整数形式がありません。また、BigNum(Java用語を使用する)や任意精度の算術演算に似たものはサポートされていません。大きい数値を格納する場合は、文字列などの他の格納方法を使用する必要があります。

1:実際の仕様を取得するためにお金がかかるんように私は、ウィキペディアにリンクした法的/正式に - 誰かがより良いソースがある場合に、それを編集してください

2

Javascriptがいずれかを持っていません。大きな整数のサポート。これは、64ビットの浮動小数点数を使用して、数値、精度、符号と指数を格納します。

良い練習がこれらの数字の文字列表現を使用することです:

alert("10466511635124471"); 

お知らせFacebookのグラフAPIからこのJSONレスポンス: より小さい32ビット整数になりますすべての合理的数字はまだ整数であるが、 FacebookのユーザーとしてのIDSとして64ビット整数は、それらが文字列に変換されています:

http://graph.facebook.com/cocacola

-1

最大の正の数が許可しますJavascriptで1.79E + 308です。

あなたは数(10466511635124471)、+ largetよりも大きい取った

これはここのhttpを参照してください10466511635124472.

関連する問題