doubleがNaNと等しいかどうかを確認するためにどのようにテストしますか?


回答:


475

静的の使用Double.isNaN(double)方法、またはあなたDouble.isNaN()方法を。

// 1. static method
if (Double.isNaN(doubleValue)) {
    ...
}
// 2. object's method
if (doubleObject.isNaN()) {
    ...
}

単に行う:

if (var == Double.NaN) {
    ...
}

NaNおよび浮動小数点数のIEEE標準がどのように定義されているかにより、十分ではありません


51
これを行う別の方法は、v!= vです。NaNのみがfalseをそれ自体と比較します。ただし、これを行わないでください。isNaNは100万倍優れています。:)
ヨレン

5
@Joren、遅くなるより遅くなる: 'isNaN'は読みやすさのためにvよりも実際に使用する方がよい!= v。しかし、isNaNメソッドのソースコードはv!= vとまったく同じです。ソース:static public boolean isNaN(double v){return(v!= v); }
ロルフツデク

1
Double.isNaN should be (true) いい答え
オリバーショー

@Joren isNaNはv!= v;)をチェックするだけですが、見栄えが良い
ジェダイ氏は

Java 5の使用:value == Double.NaN機能しませんが、Double.isNaN(value)正常に機能します。
zero01alpha

45

試してくださいDouble.isNaN()

このDouble値が非数(NaN)の場合はtrueを返し、それ以外の場合はfalseを返します。

double.isNaN()ボックス化されていないdoubleにはメソッドが関連付けられていないため、[ ]は機能しません。


Javaのプリミティブ型のメソッドを呼び出せないと思いました。それは本当にである必要がDouble.isNan()ありませんdouble.IsNan()ね?
ヨレン

Joren、彼はオートボクシングに依存しています(doubleはコンパイラー/ランタイムによってDoubleに変換されます)。1.5以降の新機能。この方向に進むリスクはほとんどありません。Doubleからdoubleに移行すると、NullPointerExceptionsのリスクが生じます。
M1EK 2009

オートボクシングは、引数としてdoubleを使用したり、コレクションに追加したりするなどの方法でのみ機能すると思いました。二重のxを宣言してから、xにisNaN()を要求すると、コンパイラエラーが発生します。
カール・

本当に、私はアンドリューが最初の「ダブル」を入力するシフトキーを逃しただけだと思います。
カール

14

を介して値が有限であるかどうかの確認も検討することをお勧めしDouble.isFinite(value)ます。Java 8以降では、Doubleクラスに新しいメソッドがあり、値がNaNや無限大でないかどうかをすぐに確認できます。

/**
 * Returns {@code true} if the argument is a finite floating-point
 * value; returns {@code false} otherwise (for NaN and infinity
 * arguments).
 *
 * @param d the {@code double} value to be tested
 * @return {@code true} if the argument is a finite
 * floating-point value, {@code false} otherwise.
 * @since 1.8
 */
public static boolean isFinite(double d)

10

NaNを確認するには、を使用しvar != varます。NaN等しくないNaN

編集:これはおそらく最悪の方法です。わかりにくく、読みづらく、全体的に悪い習慣です。


3
誰かが反対票を説明できますか?私は知っています、この方法は非常に悪く、isNan読みやすさのために優れていますが、それはうまくいきますか?そして、isNanメソッドはこれを使用してをチェックしNaNます。
HyperNeutrino、2015年

1
この方法は非常に悪く、読みやすさの点でisNaNの方が良いため、反対票があったと思います。
Edward Falk

1
私はあなたに反対票を投じませんでしたが、ここで追加のコメントが役立つと思います。FloatやDoubleのようなラッパーを比較すると、参照をこのように比較することになり、値を比較することになります。
Battle_Slug 2016

3
@Battle_Slugコメントありがとうございます。これは非常に悪い考えであることは知っていますが、完全を期すためにここに置いておきます。
HyperNeutrino 2016年

isNaNこれは内部で行われますが、どのように機能しますか?何かがどのようにそれ自体に等しくないのですか?
wilmol

0

初心者には実用的な例が必要です。次のコードを試してください。

public class Not_a_Number {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    String message = "0.0/0.0 is NaN.\nsimilarly Math.sqrt(-1) is NaN.";        
    String dottedLine = "------------------------------------------------";     

    Double numerator = -2.0;
    Double denominator = -2.0;      
    while (denominator <= 1) {
        Double x = numerator/denominator;           
        Double y = new Double (x);
        boolean z = y.isNaN();
        System.out.println("y =  " + y);
        System.out.println("z =  " + z);
        if (z == true){
            System.out.println(message);                
        }
        else {
            System.out.println("Hi, everyone"); 
        }
        numerator = numerator + 1;
        denominator = denominator +1;
        System.out.println(dottedLine);         
    } // end of while

} // end of main

} // end of class

2
この例は多すぎるため、何を表示しようとしているかは明確ではありません。これは断片化されたコードのほんの一部です。
Jared Hooper

3
この質問が'09に戻されたときに初心者だったOPとして、受け入れられた回答がこの「実用的な」例よりもはるかに役立つことを確信できます。
Eric Wilson

このサンプルコードを投稿してくれて、@ pggajendra babuに感謝します。
datnt 2017年

0

以下のコードスニペットは、NaNを保持するプリミティブ型を評価するのに役立ちます。

double dbl = Double.NaN; Double.valueOf(dbl).isNaN() ? true : false;

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.