Double.isNaN în Java

Verifică dacă un double este NaN („nu este număr”), rezultatul unor calcule fără sens, ca 0.0 / 0.0.

Sintaxă
static boolean isNaN(double v)
boolean isNaN()

Ce face Double.isNaN

NaN (Not a Number) este o valoare specială de tip double, produsă de calcule nedefinite: 0.0 / 0.0, Math.sqrt(-1), Math.log(-5). Un calcul cu double nu aruncă excepții, ci produce NaN sau Infinity, iar NaN se „lipește” de toate calculele care urmează.

Particularitatea lui NaN: nu este egal cu nimic, nici cu el însuși. x == Double.NaN este mereu false. Singura verificare corectă este Double.isNaN(x) (sau metoda de obiect x.isNaN() pe un Double). Pentru infinit există Double.isInfinite, iar pentru „număr obișnuit” Double.isFinite.

Parametri

Parametru Descriere
v Valoarea verificată.

Ce returnează

true dacă valoarea este NaN.

Exemple

Exemplul 1: De unde apare NaN

public class Main {
    public static void main(String[] args) {
        double a = 0.0 / 0.0;
        double b = Math.sqrt(-4);
        double c = 5.0 / 0.0;
        System.out.println(a + " " + b + " " + c);
        System.out.println(Double.isNaN(a) + " " + Double.isNaN(b) + " " + Double.isNaN(c));
        System.out.println(a == Double.NaN);
        System.out.println(a + 100);
        System.out.println(Double.isInfinite(c));
    }
}

Rezultat

NaN NaN Infinity
true true false
false
NaN
true

Exemplul 2: Media unei liste goale

Împărțirea 0.0 / 0 dă NaN; verificăm înainte de a afișa.

public class Main {
    static double medie(double[] note) {
        double suma = 0;
        for (double n : note) {
            suma += n;
        }
        return suma / note.length;
    }

    public static void main(String[] args) {
        double[][] clase = {{9, 10, 8}, {}};
        for (double[] note : clase) {
            double m = medie(note);
            if (Double.isNaN(m)) {
                System.out.println("Nicio notă încă");
            } else {
                System.out.println("Media: " + m);
            }
        }
    }
}

Rezultat

Media: 9.0
Nicio notă încă

Greșeli frecvente

  • Scrii if (x == Double.NaN): condiția nu este adevărată niciodată. Folosește Double.isNaN(x).
  • Te aștepți ca împărțirea la zero cu double să arunce excepție. Doar împărțirea întreagă (int/long) aruncă ArithmeticException.

Comenzi înrudite

  • Double.parseDouble: Double este wrapperul pentru double; parseDouble și valueOf transformă un text ca „3.75” în număr cu zecimale.
  • Double.compare: Compară două valori double și returnează negativ, 0 sau pozitiv, tratând corect NaN și -0.0.
  • Math.sqrt: sqrt() calculează rădăcina pătrată, cbrt() rădăcina cubică (care funcționează și pentru numere negative).
  • Math.log: log() dă logaritmul natural (baza e), log10() logaritmul în baza 10, iar log1p(x) calculează precis ln(1 + x).