Bir çiftin NaN'ye eşit olup olmadığını nasıl test edersiniz?


283

Java bir çift var ve olup olmadığını kontrol etmek istiyorum NaN. Bunu yapmanın en iyi yolu nedir?

Yanıtlar:


475

Statik kullanın Double.isNaN(double)yöntemi veya Doublebireyin .isNaN()yöntemi.

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

Basitçe:

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

olduğunu yeterli değildir nasıl nedeniyle NaN IEEE standart ve kayan noktalı sayılar tanımlanır.


51
Bunu yapmanın başka bir yolu v! = V'dir. Yalnızca NaN, yanlış ile kendi kendini karşılaştırır. Yine de bunu yapma, isNaN bir milyon kat daha iyi. :)
Joren

5
@Joren, hiç olmadığı kadar geç: 'isNaN' kullanımı gerçekten okunabilirlik için v! = V'den daha iyidir. Ancak isNaN yönteminin kaynak kodu v! = V demekle tamamen aynıdır Kaynak: statik genel boolean isNaN (double v) {return (v! = V); }
Rolf ツ

1
Double.isNaN should be (true) güzel cevap
Oliver Shaw

@Joren isNaN sadece v! = V;) 'yi kontrol edin ama daha iyi görünüyor
Bay Jedi

Java 5: kullanmak value == Double.NaNişe yaramaz, ancak iyi Double.isNaN(value)çalışır.
zero01alpha

45

Deneyin Double.isNaN():

Bu Double değeri Sayı Değil (NaN) ise true değerini, aksi takdirde false değerini döndürür.

double.isNaN()Kutusuz çiftler kendileriyle ilişkili yöntemlere sahip olmadığından [ ] çalışmaz.


Java'da ilkel türlerde yöntem çağıramayacağınızı düşündüm. Gerçekten olmalı Double.isNan()ve olmamalı double.IsNan(), değil mi?
Joren

Joren, otomatik kutulamaya güveniyor (derleyici / çalışma zamanı tarafından iki kez Double'e dönüştürülüyor); 1.5'ten itibaren yeni özellik. Bu yönde ilerlemek için çok az risk vardır; Double'ten double'a geçmek NullPointerExceptions riski oluşturur.
M1EK

Ben otomatik boks sadece bir koleksiyon, ve benzeri ekleyerek, bir argüman olarak çift kullanarak çalıştı düşündüm. Çift x bildirmeyi deneyin ve sonra x'den isNaN () sorma - derleyici hatası verir.
Carl

Gerçekten, Andrew'un ilk "çift" i yazarak shift tuşunu kaçırdığından şüpheleniyorum.
Carl

14

Ayrıca bir değerin sonlu olup olmadığını kontrol etmeyi de düşünebilirsiniz Double.isFinite(value). Java 8'den beri, Doublesınıfta bir değerin NaN ve sonsuz olmadığını hemen kontrol edebileceğiniz yeni bir yöntem var .

/**
 * 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

Kullanarak NaN kontrol edebilirsiniz var != var. NaNeşit değil NaN.

EDIT : Bu muhtemelen en kötü yöntemdir. Kafa karıştırıcı, okunabilirlik için korkunç ve genel olarak kötü uygulama.


3
Birisi düşüşü açıklayabilir mi? Biliyorum, bu yol çok kötü ve isNanokunabilirlik için daha iyi, ama işe yarıyor, değil mi? Ve isNanyöntem bunu kontrol etmek için kullanır NaN.
HyperNeutrino

1
Sanırım aşağı oy, bu yolun çok kötü olması ve isNaN'nin okunabilirlik açısından daha iyi olmasıydı.
Edward Falk

1
Sizi küçümsemedim, ancak burada ek yorumun yararlı olacağını düşünüyorum: Float veya Double gibi sarmalayıcıları karşılaştırırsanız, referansları bu şekilde karşılaştırırsınız, değerleri değil, kesinlikle istediğiniz şey değildir.
Battle_Slug

3
@Battle_Slug Yorum için teşekkürler. Bunun çok kötü bir fikir olduğunu biliyorum, ama tamlık için buraya koydum.
HyperNeutrino

isNaNbunu kaputun altında yapar, ama nasıl çalışır? Bir şey nasıl eşit değildir?
wilmol

0

Yeni başlayanların pratik örneklere ihtiyacı vardır. bu yüzden aşağıdaki kodu deneyin.

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
Bu örnek çok şey yapıyor ve ne göstermeye çalıştığınız belli değil. Bu sadece bir grup parçalanmış kod.
Jared Hooper

3
Bu soru '09'da sorulduğunda yeni başlayan OP olarak, kabul edilen cevabın bu "pratik" örnekten çok daha yararlı olduğunu temin ederim.
Eric Wilson

@Pggajendra babu bu örnek kodu yayınladığınız için teşekkür ederiz.
datnt

0

Aşağıdaki kod snippet'i, ilkel tür tutma NaN'sinin değerlendirilmesine yardımcı olacaktır.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.