数値が無限大と評価されるかどうかを確認するにはどうすればよいですか?


93

(IEでのみ)ユーザーの選択に応じて無限大を示す一連のJavaScript計算があります。

どのようにして単語のInfinity出現を止め、たとえば0.0代わりに表示しますか?

回答:


173
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
    // ...
}

isFinite処理方法に応じて、代わりに関数を使用できますNaN。あなたの番号が、またはの場合にをisFinite返しfalseます。POSITIVE_INFINITYNEGATIVE_INFINITYNaN

if (isFinite(result))
{
    // ...
}

2
なぜ使うNumber.(POSITIVE|NEGATIVE)_INFINITYのではなく、-?Infinity-?1/0
Eli Grey

5
@Eli:グローバルInfinityプロパティは読み取り専用ではないため、再定義できます。たとえば、"true"var x = 42; Infinity = 42; alert(x === Infinity);表示されます。(確かにあいまいなケースだ、と再定義することを決定誰、などが奇数物事が起こることを期待すべきである。)InfinityNaN
LukeH

Number.(POSITIVE|NEGATIVE)_INFINITY読み取り専用ではないという事実を無視すると、厳密モードでInfinity 読み取り専用になります。また、-?1/0私があなたに提示したケースはどうですか?とにかく、ほとんどの場合、isFinite代わりに使用する必要があります。
Eli Grey

1
@Eli:私のテストNumber.POSITIVE_INFINITYNumber.NEGATIVE_INFINITY 読み取り専用です(Chrome8、FF3.6、IE8でテスト済み)。の使用1/0は問題なく動作しますが、実際にテストしようとしているのはコードのメンテナにとってそれほど明白ではありません。isFiniteほとんどの場合、使用することがより良い方法であることに同意します-それが私の回答でそれを述べた理由です-しかし、OPのみが要件を満たすかどうかを決定できます。
LukeH、2011年

4
これらは読み取り専用ではありません(読み取り:構成不可)。ゲッターを持つアクセサーであり、セッターはありません。Object.definePropertyおよびで再定義できます__defineGetter__Infinity一方、ある厳密モードにおいて非構成。
イーライグレイ

9

シンプルn === n+1またはn === n/0機能:

function isInfinite(n) {
  return n === n/0;
}

ネイティブisFinite()が数値への入力を強制することに注意してください。isFinite([])isFinite(null)両方trueの例です。


この答えは間違いです。n === n+12 ^ 53より大きいすべての数値、つまり1e30に対してtrueと評価されます。分割ハックは、NaNと-Infinityでも機能します。ただし、LukeHの回答により、コードが読みやすくなります。
tglas 2018

@tglasなぜそのようなプラスなのですか?部門がしっかりしているのは嬉しい。数学は単語よりも普遍的であるため、IMOのコードは読みやすく包括的です。
ライアンブ2018

1
IEEE 64ビット浮動小数点数には53桁の有効2進数があるため(en.wikipedia.org/wiki/IEEE_754を参照)、表現n+1できず、丸められる可能性があります。まあ、整数でも丸め誤差の影響を受けます。ところで、私はあなたのコードが「数学に耐える」とは思わない、ただ試してくださいn === n/-0。+/- infで実数を完成させる場合、基礎となるゼロシーケンスが正であると見なされない限り、制限は明確に定義されません。
tglas

@tglasに感謝JavaScriptがゼロで除算できることを
いつまでも愛しています

6

ではES6Number.isFinite()メソッドは渡された値が有限数かどうかを判断します。

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

ECMAScript 1からアクセス可能
MohaMad 2017

2

実際、n === n + 1は、51ビットより大きい数値で機能します。例:

1e16 + 1 === 1e16; // true
1e16 === Infinity; // false

3
これは、ライアンブの答えに対するコメントであるべきです。
Gary

1

読みやすさだけでなく、さまざまな防御的コーディングの理由でLodashを使用するのが好きです。ES6 は素晴らしく、数値以外の値に関する問題はありませんが、ES6が不可能な場合は、lodashがすでにあるか、コードを簡潔にする必要があります:_ . isFiniteNumber.isFinite

_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false

_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true

0

値がNaNまたはInfinityタイプであるかどうかを確認する必要があるが、文字列を有効な結果として渡すシナリオに遭遇しました。多くのテキスト文字列はfalse-positiveを生成するのでNaN、それを回避する簡単な解決策を作りました:

  const testInput = input => input + "" === "NaN" || input + "" === "Infinity";

上記のコードは値を文字列に変換し、それらがNaNまたはInfinityと完全に等しいかどうかをチェックします(負の無限大の場合は別のケースを追加する必要があります)。

そう:

testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false

この投稿は、実際の質問についてはここでは扱っていません。承認された回答の下でのコメントとしては優れているでしょう。OPは数字と無限大ではなく、文字列や程度であるNaNなどの、
code_dredd

あなたはおそらく正しい、@ code_dredd-逸話は関係ありません。しかし、解決策はまだ機能します。それは無限数を検出できます-私が間違っている場合は修正してください。
dmitrizzle

それは要点の外です。これを正しく行う方法を示す答えがすでにあります。言語自体がばかげたことを行い、型の管理方法と矛盾しているために、単に「機能する」ものです。このようなハックコードを書かないようにしてください。
code_dredd

toString()代わりに使ったらもっと幸せになりますか?これにより一貫性のない結果が生じる可能性がある理由、またはこの方法が推奨されない理由について、自由に投票または理由を述べてください。これまでのところ、それは答えを探している人のためのオプションを追加するものであり、これが危険で不安定であるなどの具体的な理由はありません
dmitrizzle

-1

ウィンドウでisFiniteを使用できますisFinite(123)

次のような関数を書くことができます:

function isInfinite(num) {
 return !isFinite(num);
}

そして次のように使用します:

isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true

あなたもできるNumber.isFinit値があまりにもナンバーで、チェックするための、より正確である場合もチェックされ電子undefinednull等...

または、次のようにポリフィルできます。

Number.isFinite = Number.isFinite || function(value) {
  return typeof value === 'number' && isFinite(value);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.