Ce face BigDecimal.add
a.add(b), a.subtract(b) și a.multiply(b) calculează exact, fără rotunjire. Rezultatul este un BigDecimal nou; a și b rămân neschimbate.
Scala rezultatului urmează reguli simple: la adunare și scădere este cea mai mare dintre cele două scale (1.5 + 2.25 = 3.75); la înmulțire este suma scalelor (1.5 × 2.25 = 3.375, scala 3). De aceea, după o înmulțire cu un procent, rotunjești de obicei cu setScale(2, ...).
Parametri
| Parametru | Descriere |
|---|---|
alt |
Al doilea număr; nu poate fi null. |
Ce returnează
Un BigDecimal nou cu rezultatul.
Exemple
Exemplul 1: Factură cu TVA 19%
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal pret = new BigDecimal("249.90");
BigDecimal cantitate = new BigDecimal("3");
BigDecimal subtotal = pret.multiply(cantitate);
BigDecimal tva = subtotal.multiply(new BigDecimal("0.19"));
System.out.println("Subtotal: " + subtotal);
System.out.println("TVA exact: " + tva + " -> rotunjit: " + tva.setScale(2, RoundingMode.HALF_UP));
System.out.println("Total: " + subtotal.add(tva).setScale(2, RoundingMode.HALF_UP) + " lei");
}
}
Rezultat
Subtotal: 749.70
TVA exact: 142.4430 -> rotunjit: 142.44
Total: 892.14 lei
Exemplul 2: Sold după retrageri
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal sold = new BigDecimal("1000.00");
String[] retrageri = {"150.25", "99.99", "300"};
for (String r : retrageri) {
sold = sold.subtract(new BigDecimal(r));
System.out.println("După retragerea de " + r + ": " + sold);
}
System.out.println("Datorie dacă retrag 500: " + sold.subtract(new BigDecimal("500")).negate());
}
}
Rezultat
După retragerea de 150.25: 849.75
După retragerea de 99.99: 749.76
După retragerea de 300: 449.76
Datorie dacă retrag 500: 50.24
Exemplul 3: Cum se schimbă scala
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("1.5");
BigDecimal b = new BigDecimal("2.25");
System.out.println("add: " + a.add(b) + " (scala " + a.add(b).scale() + ")");
System.out.println("subtract: " + a.subtract(b) + " (scala " + a.subtract(b).scale() + ")");
System.out.println("multiply: " + a.multiply(b) + " (scala " + a.multiply(b).scale() + ")");
}
}
Rezultat
add: 3.75 (scala 2)
subtract: -0.75 (scala 2)
multiply: 3.375 (scala 3)
Greșeli frecvente
- Scrii
a + bcuBigDecimal. Nu compilează; foloseștea.add(b). - Apelezi
sold.subtract(x);și te aștepți casoldsă se schimbe. Scriesold = sold.subtract(x);.
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.divide: Împărțire între BigDecimal; când rezultatul are zecimale infinite (10/3) trebuie să dai scala și modul de rotunjire.BigDecimal.setScale: Rotunjește (sau completează cu zerouri) un BigDecimal la un număr fix de zecimale: setScale(2, RoundingMode.HALF_UP).BigDecimal.valueOf: Creează un BigDecimal dintr-un long sau dintr-un double, folosind forma lui zecimală scurtă (0.1 rămâne 0.1).