Nauka programowania Java #15: Pakiet Math i klasy BigInteger oraz BigDecimal

Zgodnie z zasadą ‘nie wymyślaj koła od nowa’ w Javie zaimplementowano prosta klasę z metodami statycznymi, przydatną do obliczeń matematycznych. Klasa nosi nazwę Math i posiada szereg przydatnych metod. Oto one:

System.out.println("Liczba e " + Math.E);
System.out.println("Liczba pi " + Math.PI);
System.out.println("Wartość bezwględna " + Math.abs(-10));
System.out.println("Wartość minimalna " + Math.min(10, 20));
System.out.println("Wartość maksymalna " + Math.max(10, 20));
System.out.println("Logarytm naturalny " + Math.log(10));
System.out.println("Logarytm z dziesieciu " + Math.log10(10));
System.out.println("Ucina część ułamkową " + Math.floor(10.5));
System.out.println("Zaokrągla w górę " + Math.round(10.5));
System.out.println("Oblicza potęge " + Math.pow(10, 3));
System.out.println("Oblicza pierwiastek o podstawie dwa " + Math.sqrt(16));
System.out.println("Wartość sinusa " + Math.sin(100));
System.out.println("Losuje liczbę z zakresu od 0.0 do 1.0 " + Math.random());

Proste, co nie?

Pamiętasz jedną z pierwszych lekcji, w której starałem się wytłumaczyć problemy wynikające ze zmiennego przecinka? W Javie także istnieje specjalna klasa, która umożliwia bezpieczne pisanie liczb ułamkowych (praktycznie bez zakresu). BigDecimal używasz poprzez stworzenie obiektu lub użycie statycznych pól takich jak ONE, TWO, lub metody valueOf(„liczba”). Ponieważ jest to klasa, to nie możesz użyć na niej zwykłych operatorów dodawania i odejmowania, jak w przypadku typu prostego. Zamiast nich używasz odpowiednich metod, jak np. substract (odejmowanie).

System.out.println("Jeden: " + BigDecimal.ONE);
System.out.println("Dwa: " + new BigDecimal(2));
System.out.println("Dwa i pół: " + new BigDecimal(2.5));
System.out.println("Trzy: " + new BigDecimal("3"));

System.out.println("Błąd przy zaokrągleniu: " + (0.04 - 0.03));System.out.println("Błąd przy zaokrągleniu: " + (0.04 - 0.03)); 
System.out.println("Poprawne działanie: " + new BigDecimal("0.04").subtract(new BigDecimal("0.03")));

Jak widać po rezultacie wynik jest poprawny. Jednak, gdy wpiszesz w nawiasach liczbę, która nie będzie zapisana w cudzysłowie, to wynik będzie błędny, ponieważ konstruktor wywołany w klasie po prostu opakuje liczbę typu prostego double.

System.out.println("Bez cudzysłowie: " + new BigDecimal(0.04).subtract(new BigDecimal(0.03)));

Zakres ułamka jest naprawdę spory.

Podobną klasą jest BigInteger. Pełni ona funkcję klasy rozszerzającej zwykłego inta, gdy potrzebujemy zapisać liczbę bardzo dużą. Przydatne jest to np. przy pracy z bazami danych, gdzie liczba transakcji w ciągu kilku lat może przekraczać zakres inta.

long longValue = 10000000000000l;
System.out.println("Wartość zapisana jako long " + longValue);
System.out.println("Liczba przekraczająca zakres longa " + new BigInteger("1000000000000000000000000000"));

 

Dodaj komentarz