BigDecimal.divide în Java

Împărțire între BigDecimal; când rezultatul are zecimale infinite (10/3) trebuie să dai scala și modul de rotunjire.

Sintaxă
BigDecimal divide(BigDecimal impartitor)
BigDecimal divide(BigDecimal impartitor, int scala, RoundingMode rotunjire)
BigDecimal divide(BigDecimal impartitor, MathContext context)

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 divide fă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ște RoundingMode.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.