
Klasa BigDecimal – pojęcie skali
Obiekty BigDecimal są podobnie jak obiekty BigInteger – immutable. Co to znaczy – już wiemy.
Liczby przez nie przedstawiane są dziesiętne, ze znakiem i nie są zmiennoprzecinkowe. Mają z góry określoną precyzję – mówiliśmy o niej wcześniej.
Skala
Każda liczba BigDecimal jest złożona z 2 wartości:
- nieskalowanej liczby całkowitej – oznaczymy ją przez a
- 32-bitowej liczby całkowitej określającej skalę – oznaczymy ją przez b.
Liczba jest skalowana i jest przedstawiona w następującej postaci:
![]()
Mamy liczbę a=235123 oraz skalę b = 3.
Liczba będzie przedstawiona jako:
![]()
W tym przypadku skala określiła liczbę miejsc po kropce dziesiętnej.
Oznacza to też, że liczba 235.123 podana jako liczba double zostanie zapisana jako para 235123 i -3. Najwygodniej jest więc podać liczbę jako całkowitą, oraz określić położenie przecinka, przez podanie skali.
Jeśli skala b = -3 to liczba będzie przedstawiona jako:
![]()
Java przekształci tę liczbę do:
![]()
Możemy to zapisać (BigDec02.java):
MathContext mc = new MathContext("precision=15 roundingMode=HALF_EVEN");
BigDecimal bd1 = new BigDecimal(new BigInteger("235123"), 3, mc);
BigDecimal bd2 = new BigDecimal(new BigInteger("235123"), -3, mc);
Util.print(bd1);
Util.print(bd2);
Po uruchomieniu otrzymamy na konsoli:
235.123
2.35123E+8
Można też powiedzieć, że skala dodatnia przesuwa kropkę dziesiętną w lewo, a ujemna – w prawo.
Dokumentacja Java zaleca ustalanie skali:
| Operacja | Preferowana skala wyniku |
|---|---|
| dodawanie | max(skala stron dodawania) |
| odejmowanie | max(skala odjemnej, skala odjemnika) |
| mnożenie | skala mnożnej + skala mnożnika |
| dzielenie | skala dzielnej – skala dzielnika |
