Java podstawy #15: Funkcje matematyczne i 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 przeróżne funkcje matematyczne, które mogą być dla Ciebie przydatne. 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?

BigDecimal

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.

BigInteger

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"));

Link do lekcji: https://github.com/developeronthego/java-basics/tree/main/src/main/java/basics/lesson15

Może Ci się również spodoba

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *