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 |