BigDecimal.add în Java

Adunare, scădere și înmulțire exactă între BigDecimal; fiecare returnează un număr nou.

Sintaxă
BigDecimal add(BigDecimal alt)
BigDecimal subtract(BigDecimal alt)
BigDecimal multiply(BigDecimal alt)
BigDecimal negate()

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 + b cu BigDecimal. Nu compilează; folosește a.add(b).
  • Apelezi sold.subtract(x); și te aștepți ca sold să se schimbe. Scrie sold = 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).