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.