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șteDouble.compare. - Folosești
compare(a, b) == 0ca să verifici dacă două rezultate de calcul sunt egale:0.1 + 0.2și0.3tot 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.