Obiekty BigDecimal są podobnie jak obiekty BigIntegerimmutable. 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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *