Zielony Smok - logo witryny

Klasa BigDecimal – pojęcie skali

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:

Pojęcie skali w klasie BigDecimal

Mamy liczbę a=235123 oraz skalę b = 3.

Liczba będzie przedstawiona jako:

Pojęcie skali w klasie BigDecimal

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:

Pojęcie skali w klasie BigDecimal

Java przekształci tę liczbę do:

Pojęcie skali w klasie BigDecimal

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