BigDecimal.compareTo în Java

Compară valorile a două BigDecimal (negativ, 0, pozitiv); spre deosebire de equals, 2.0 și 2.00 sunt egale.

Sintaxă
int compareTo(BigDecimal alt)
boolean equals(Object alt)
int signum()
BigDecimal max(BigDecimal alt)
BigDecimal min(BigDecimal alt)

Ce face BigDecimal.compareTo

a.compareTo(b) returnează un număr negativ dacă a < b, 0 dacă sunt egale ca valoare și un număr pozitiv dacă a > b. Pentru comparații scrii a.compareTo(b) > 0, a.compareTo(b) == 0 etc.

Atenție la equals: la BigDecimal compară și valoarea, și scala. new BigDecimal("2.0").equals(new BigDecimal("2.00")) este false, deși numerele sunt egale. Pentru egalitatea valorilor folosește mereu compareTo(...) == 0.

signum() dă −1, 0 sau 1 după semn; max și min returnează numărul mai mare sau mai mic.

Parametri

Parametru Descriere
alt Numărul cu care se compară.

Ce returnează

Un int: negativ, 0 sau pozitiv.

Exemple

Exemplul 1: equals față de compareTo

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("2.0");
        BigDecimal b = new BigDecimal("2.00");
        System.out.println("equals: " + a.equals(b));
        System.out.println("compareTo: " + a.compareTo(b));
        System.out.println("Egale ca valoare: " + (a.compareTo(b) == 0));
    }
}

Rezultat

equals: false
compareTo: 0
Egale ca valoare: true

Exemplul 2: Are clientul destui bani?

import java.math.BigDecimal;

public class Main {
    static String plata(BigDecimal sold, BigDecimal pret) {
        int c = sold.compareTo(pret);
        if (c > 0) return "plată reușită, rest " + sold.subtract(pret);
        if (c == 0) return "plată reușită, soldul ajunge la zero";
        return "fonduri insuficiente, lipsesc " + pret.subtract(sold);
    }

    public static void main(String[] args) {
        BigDecimal pret = new BigDecimal("149.99");
        System.out.println("Ana: " + plata(new BigDecimal("200.00"), pret));
        System.out.println("Mihai: " + plata(new BigDecimal("149.990"), pret));
        System.out.println("Ioana: " + plata(new BigDecimal("120.50"), pret));
    }
}

Rezultat

Ana: plată reușită, rest 50.01
Mihai: plată reușită, soldul ajunge la zero
Ioana: fonduri insuficiente, lipsesc 29.49

Exemplul 3: Cel mai mare preț, semnul și sortarea

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<BigDecimal> preturi = new ArrayList<>(List.of(
            new BigDecimal("19.99"), new BigDecimal("5.5"), new BigDecimal("120"), new BigDecimal("-3.00")));
        System.out.println("Maxim: " + Collections.max(preturi));
        System.out.println("max(5.5, 19.99): " + preturi.get(1).max(preturi.get(0)));
        System.out.println("Semnul lui -3.00: " + preturi.get(3).signum());
        Collections.sort(preturi);
        System.out.println("Sortate: " + preturi);
    }
}

Rezultat

Maxim: 120
max(5.5, 19.99): 19.99
Semnul lui -3.00: -1
Sortate: [-3.00, 5.5, 19.99, 120]

Greșeli frecvente

  • Verifici egalitatea cu equals. 2.0 și 2.00 par diferite; folosește compareTo(...) == 0.
  • Pui BigDecimal într-un HashSet și te aștepți ca 2.0 și 2.00 să fie una. HashSet folosește equals; folosește TreeSet sau stripTrailingZeros().

Comenzi înrudite

  • BigDecimal: Număr zecimal exact, fără erori de rotunjire ca la double; se folosește pentru bani, prețuri și calcule financiare.
  • BigDecimal.setScale: Rotunjește (sau completează cu zerouri) un BigDecimal la un număr fix de zecimale: setScale(2, RoundingMode.HALF_UP).