Ce face BigDecimal.valueOf
BigDecimal.valueOf(long) creează un număr întreg exact. valueOf(1999, 2) creează 19.99: valoarea 1999 cu 2 cifre după virgulă, util când ții prețurile în bani.
BigDecimal.valueOf(double) folosește textul dat de Double.toString(valoare), deci valueOf(0.1) dă exact 0.1, spre deosebire de new BigDecimal(0.1). Dacă valoarea double era deja greșită dintr-un calcul anterior, eroarea rămâne.
Pentru valori mici obișnuite (0, 1, 10), metoda returnează obiecte refolosite, deci este puțin mai eficientă decât constructorul.
Parametri
| Parametru | Descriere |
|---|---|
valoare |
Un long sau un double. |
scala |
Câte cifre din valoareNescalata sunt după virgulă. |
Ce returnează
Un BigDecimal.
Exemple
Exemplul 1: Cele trei variante
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
System.out.println("valueOf(250): " + BigDecimal.valueOf(250));
System.out.println("valueOf(1999, 2): " + BigDecimal.valueOf(1999, 2));
System.out.println("valueOf(0.1): " + BigDecimal.valueOf(0.1));
System.out.println("new BigDecimal(0.1): " + new BigDecimal(0.1));
}
}
Rezultat
valueOf(250): 250
valueOf(1999, 2): 19.99
valueOf(0.1): 0.1
new BigDecimal(0.1): 0.1000000000000000055511151231257827021181583404541015625
Exemplul 2: Prețuri ținute în bani, afișate în lei
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
long[] preturiInBani = {1999, 450, 12990};
BigDecimal total = BigDecimal.ZERO;
for (long bani : preturiInBani) {
BigDecimal lei = BigDecimal.valueOf(bani, 2);
System.out.println(lei + " lei");
total = total.add(lei);
}
System.out.println("Total: " + total + " lei");
}
}
Rezultat
19.99 lei
4.50 lei
129.90 lei
Total: 154.39 lei
Exemplul 3: valueOf nu repară un double deja greșit
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
double suma = 0.1 + 0.2;
System.out.println(BigDecimal.valueOf(suma));
System.out.println(BigDecimal.valueOf(0.1).add(BigDecimal.valueOf(0.2)));
}
}
Rezultat
0.30000000000000004
0.3
Greșeli frecvente
- Faci calculele în
doubleși transformi înBigDecimaldoar la final. Erorile s-au produs deja; transformă valorile la început. - Confunzi
valueOf(1999, 2)cu „1999 rotunjit la 2 zecimale”. Rezultatul este 19.99, nu 1999.00.
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.add: Adunare, scădere și înmulțire exactă între BigDecimal; fiecare returnează un număr nou.BigDecimal.setScale: Rotunjește (sau completează cu zerouri) un BigDecimal la un număr fix de zecimale: setScale(2, RoundingMode.HALF_UP).