Ce face BigDecimal.divide
a.divide(b) fără alte argumente încearcă să dea rezultatul exact. Merge pentru 10 / 4 = 2.5, dar pentru 10 / 3 = 3.333… rezultatul are o infinitate de zecimale și metoda aruncă ArithmeticException: „Non-terminating decimal expansion”.
Soluția este să spui câte zecimale vrei și cum să rotunjească: a.divide(b, 2, RoundingMode.HALF_UP) dă 3.33. Alternativ, divide(b, MathContext.DECIMAL64) păstrează 16 cifre semnificative. Împărțirea la zero aruncă mereu ArithmeticException.
Parametri
| Parametru | Descriere |
|---|---|
impartitor |
Numărul la care se împarte. |
scala |
Câte cifre să aibă rezultatul după virgulă. |
rotunjire |
RoundingMode.HALF_UP (rotunjirea de la școală), HALF_EVEN, DOWN etc. |
Ce returnează
Un BigDecimal nou cu câtul.
Exemple
Exemplul 1: Nota de plată împărțită la 3 prieteni
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal nota = new BigDecimal("100.00");
BigDecimal persoane = new BigDecimal("3");
try {
System.out.println(nota.divide(persoane));
} catch (ArithmeticException e) {
System.out.println("Fără rotunjire: " + e.getMessage());
}
BigDecimal parte = nota.divide(persoane, 2, RoundingMode.HALF_UP);
System.out.println("Fiecare plătește: " + parte + " lei");
System.out.println("Rest de acoperit: " + nota.subtract(parte.multiply(persoane)) + " lei");
}
}
Rezultat
Fără rotunjire: Non-terminating decimal expansion; no exact representable decimal result.
Fiecare plătește: 33.33 lei
Rest de acoperit: 0.01 lei
Exemplul 2: Împărțiri exacte și MathContext
import java.math.BigDecimal;
import java.math.MathContext;
public class Main {
public static void main(String[] args) {
System.out.println("10 / 4 = " + new BigDecimal("10").divide(new BigDecimal("4")));
System.out.println("1 / 8 = " + BigDecimal.ONE.divide(new BigDecimal("8")));
System.out.println("2 / 3 = " + new BigDecimal("2").divide(new BigDecimal("3"), MathContext.DECIMAL64));
}
}
Rezultat
10 / 4 = 2.5
1 / 8 = 0.125
2 / 3 = 0.6666666666666667
Exemplul 3: Moduri de rotunjire diferite
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("5");
BigDecimal b = new BigDecimal("8");
for (RoundingMode mod : new RoundingMode[] {RoundingMode.HALF_UP, RoundingMode.HALF_EVEN, RoundingMode.DOWN, RoundingMode.UP}) {
System.out.println("5 / 8 cu 2 zecimale, " + mod + ": " + a.divide(b, 2, mod));
}
}
}
Rezultat
5 / 8 cu 2 zecimale, HALF_UP: 0.63
5 / 8 cu 2 zecimale, HALF_EVEN: 0.62
5 / 8 cu 2 zecimale, DOWN: 0.62
5 / 8 cu 2 zecimale, UP: 0.63
Greșeli frecvente
- Apelezi
dividefără scală pe date reale. Merge în teste cu valori „rotunde”, apoi pică în producție la 10/3; dă mereu scala și rotunjirea. - Folosești vechile constante
BigDecimal.ROUND_HALF_UP. Sunt depreciate; foloseșteRoundingMode.HALF_UP.
Comenzi înrudite
BigDecimal.setScale: Rotunjește (sau completează cu zerouri) un BigDecimal la un număr fix de zecimale: setScale(2, RoundingMode.HALF_UP).BigDecimal.add: Adunare, scădere și înmulțire exactă între BigDecimal; fiecare returnează un număr nou.ArithmeticException: Apare la o operație aritmetică imposibilă: împărțirea unui întreg la zero, depășiri cu Math.addExact, BigDecimal fără rotunjire.BigDecimal: Număr zecimal exact, fără erori de rotunjire ca la double; se folosește pentru bani, prețuri și calcule financiare.