BigDecimal.setScale în Java

Rotunjește (sau completează cu zerouri) un BigDecimal la un număr fix de zecimale: setScale(2, RoundingMode.HALF_UP).

Sintaxă
BigDecimal setScale(int scala, RoundingMode rotunjire)
BigDecimal setScale(int scala)

Ce face BigDecimal.setScale

setScale(2, RoundingMode.HALF_UP) returnează numărul cu exact 2 cifre după virgulă. Dacă avea mai multe, le rotunjește după modul ales; dacă avea mai puține, adaugă zerouri (5 devine 5.00).

Modurile cele mai folosite: HALF_UP (rotunjirea învățată la școală: 2.345 → 2.35), HALF_EVEN („rotunjirea bancherului”: la exact jumătate merge spre cifra pară, 2.345 → 2.34, 2.355 → 2.36), DOWN (taie zecimalele), UP (mereu în sus, în valoare absolută).

Varianta fără mod de rotunjire funcționează doar dacă nu se pierd cifre; altfel aruncă ArithmeticException.

Parametri

Parametru Descriere
scala Numărul de cifre după virgulă (poate fi și negativ: −2 rotunjește la sute).
rotunjire Modul de rotunjire, din RoundingMode.

Ce returnează

Un BigDecimal nou cu scala cerută.

Exemple

Exemplul 1: HALF_UP față de HALF_EVEN

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Main {
    public static void main(String[] args) {
        for (String s : new String[] {"2.345", "2.355", "2.341", "-2.345"}) {
            BigDecimal x = new BigDecimal(s);
            System.out.println(s + " -> HALF_UP " + x.setScale(2, RoundingMode.HALF_UP)
                + ", HALF_EVEN " + x.setScale(2, RoundingMode.HALF_EVEN)
                + ", DOWN " + x.setScale(2, RoundingMode.DOWN));
        }
    }
}

Rezultat

2.345 -> HALF_UP 2.35, HALF_EVEN 2.34, DOWN 2.34
2.355 -> HALF_UP 2.36, HALF_EVEN 2.36, DOWN 2.35
2.341 -> HALF_UP 2.34, HALF_EVEN 2.34, DOWN 2.34
-2.345 -> HALF_UP -2.35, HALF_EVEN -2.34, DOWN -2.34

Exemplul 2: Prețuri afișate mereu cu două zecimale

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Main {
    public static void main(String[] args) {
        String[] preturi = {"5", "12.5", "7.999"};
        for (String p : preturi) {
            System.out.println(new BigDecimal(p).setScale(2, RoundingMode.HALF_UP) + " lei");
        }
        System.out.println("Rotunjit la sute: " + new BigDecimal("12470").setScale(-2, RoundingMode.HALF_UP).toPlainString());
    }
}

Rezultat

5.00 lei
12.50 lei
8.00 lei
Rotunjit la sute: 12500

Exemplul 3: setScale fără rotunjire

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        System.out.println(new BigDecimal("3.5").setScale(3));
        try {
            System.out.println(new BigDecimal("3.14159").setScale(2));
        } catch (ArithmeticException e) {
            System.out.println("Eroare: " + e.getMessage());
        }
    }
}

Rezultat

3.500
Eroare: Rounding necessary

Greșeli frecvente

  • Rotunjești la fiecare pas intermediar. Erorile de rotunjire se adună; calculează exact și rotunjește o singură dată, la final.
  • Apelezi setScale(2) fără mod de rotunjire pe un rezultat cu mai multe zecimale. Aruncă ArithmeticException.

Comenzi înrudite

  • BigDecimal.divide: Împărțire între BigDecimal; când rezultatul are zecimale infinite (10/3) trebuie să dai scala și modul de rotunjire.
  • BigDecimal.add: Adunare, scădere și înmulțire exactă între BigDecimal; fiecare returnează un număr nou.
  • BigDecimal: Număr zecimal exact, fără erori de rotunjire ca la double; se folosește pentru bani, prețuri și calcule financiare.
  • Math.round: round() rotunjește la cel mai apropiat întreg (.5 în sus); rint() rotunjește .5 spre numărul par și returnează double.