Double.compare în Java

Compară două valori double și returnează negativ, 0 sau pozitiv, tratând corect NaN și -0.0.

Sintaxă
static int compare(double d1, double d2)

Ce face Double.compare

Double.compare(a, b) returnează un număr negativ dacă a < b, 0 dacă sunt egale și pozitiv dacă a > b. Este forma potrivită pentru comparatori: (x, y) -> Double.compare(x.pret(), y.pret()).

Spre deosebire de operatorii < și ==, compare definește o ordine completă: NaN este considerat egal cu el însuși și mai mare decât orice alt număr (inclusiv infinitul), iar -0.0 este considerat mai mic decât 0.0. Astfel sortarea nu se strică dacă apare un NaN.

Nu scrie comparatorul ca (int) (a - b): diferențe ca 0.4 devin 0 după conversie și valorile apar „egale”.

Parametri

Parametru Descriere
d1, d2 Cele două numere comparate.

Ce returnează

Un int: negativ, 0 sau pozitiv.

Exemple

Exemplul 1: compare față de operatori

public class Main {
    public static void main(String[] args) {
        System.out.println(Double.compare(4.5, 4.9));
        System.out.println(Double.compare(4.9, 4.5));
        System.out.println(Double.compare(4.5, 4.5));
        double nan = Double.NaN;
        System.out.println((nan == nan) + " " + Double.compare(nan, nan));
        System.out.println((0.0 == -0.0) + " " + Double.compare(0.0, -0.0));
        System.out.println((int) (4.9 - 4.5));
    }
}

Rezultat

-1
1
0
false 0
true 1
0

Exemplul 2: Sortarea produselor după preț

import java.util.ArrayList;
import java.util.List;

public class Main {
    record Produs(String nume, double pret) {}

    public static void main(String[] args) {
        List<Produs> cos = new ArrayList<>(List.of(
                new Produs("cafea", 24.90), new Produs("zahăr", 4.50), new Produs("ceai", 9.75)));
        cos.sort((a, b) -> Double.compare(a.pret(), b.pret()));
        for (Produs p : cos) {
            System.out.println(p.nume() + ": " + p.pret() + " lei");
        }
    }
}

Rezultat

zahăr: 4.5 lei
ceai: 9.75 lei
cafea: 24.9 lei

Greșeli frecvente

  • Comparatorul (a, b) -> (int) (a.pret() - b.pret()) tratează 4.50 și 4.90 ca egale. Folosește Double.compare.
  • Folosești compare(a, b) == 0 ca să verifici dacă două rezultate de calcul sunt egale: 0.1 + 0.2 și 0.3 tot diferă. Pentru calcule, compară cu o toleranță.

Comenzi înrudite

  • Integer.compare: compare() compară două int-uri (negativ, 0, pozitiv); max, min și sum sunt variante scurte pentru referințe la metode.
  • Double.isNaN: Verifică dacă un double este NaN („nu este număr”), rezultatul unor calcule fără sens, ca 0.0 / 0.0.
  • Comparatori (Comparable și Comparator): Comparable dă ordinea naturală a unei clase (compareTo); Comparator descrie orice altă ordine și se combină cu comparing, thenComparing și reversed.
  • Double.parseDouble: Double este wrapperul pentru double; parseDouble și valueOf transformă un text ca „3.75” în număr cu zecimale.