2011-10-10 21 views
0

私は数値が浮動小数点として格納されているという印象を受けています。浮動小数点数を他の言語で比較することは信頼性が低く推奨されません。シーンの裏側にある魔法は、整数でなければならないものに対してこの作業を確実に行うためのものですか?私はこれに他の参照を見つけることができません。JavaScriptの数値の比較

答えて

2

JSの浮動小数点数について正しいです。言語仕様の4.3.19セクションには、

012と表示されています倍精度64ビットバイナリフォーマットIEEE 754値に対応

Number値

プリミティブ値。

整数の浮動小数点比較はうまくいきます。 64b IEEE-754は、53乗に2未満の大きさの整数を正確に表すことができます(ULP参照)。この問題は、分割するか、または結果を近似する必要がある関数Mathを使用すると発生します。

浮動小数点演算の結果を最も近い整数に変換する必要がある場合は、Math.roundを使用します。

"What Every Computer Scientist Should Know about Floating Point"には丸め誤差の説明があります。

-2

数値が整数であることがわかっている場合は、整数に変換します(たとえば、文字列として使用できる場合は、parseInt(value)を使用して整数として比較します)。

+1

JavaScriptには、整数と浮動小数点数の型がありません。整数は '数値'です。浮動小数点数も 'Number'です。 – icktoofay

+0

私は理解しますが、あなたはそれらをintのものとして扱うことができます – Saket

0

マジック:不定、ヌル、ブール、 文字列、数値およびオブジェクト:parseInt(5) === 5; // true

のECMAScriptは、次のデータ型を持っています。 (TODO:ECMAScriptの型システムを説明 - におけるタイプ - また、一部のX参照: http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/PDF/all.pdfhttp://c2.com/cgi/wiki?CategoryLanguageTyping

ECMAScriptの番号は64ビットのバイナリ浮動小数点数です。 ( の詳細については、 [ECMA-262]を参照してください)。 SpiderMonkeyは(タイプ)タグ付きデータ の値を使用します。他のECMAScript番号 は、間接的に倍精度浮動小数点形式で格納されます(浮動小数点数は、 -point数( のjsval格納二重にタグ付けされたポインタ)。整数∈[-2^53,2^53] 二重に正確に記憶することができる。1

[1]What Every Computer Scientist Should Know About Floating-Point Arithmetic (edited version)

0

問題は、それが大きすぎる特定の整数、

整数の

、[-9007199254740992、9007199254740992](^ 53 2)を表すことができないで精度の許容範囲です。