Funkcje matematyczne, BigInteger i BigDecimal

Funkcje matematyczne - Klasa Math

Programując w Javie, często będziesz wykonywać różne operacje arytmetyczne i przydatne będą Ci gotowe funkcje matematyczne, takie jak pierwiastek kwadratowy, potęgowanie, wartość bezwzględna, sinus i inne funkcje trygonometryczne.

Większość najważniejszych funkcji matematycznych znajduje się w klasie Mathz pakietu java.lang. Kilka najważniejszych funkcji znajduje się poniżej.

  • sqrt(double liczba) - zwraca pierwiastek z liczby double. Jako parametr możemy również podać dowolny typ liczbowy, wtedy nastąpi jego automatyczna konwersja na double.
  • pow(double a, double b) - zwraca liczbę a podniesioną do potęgi b
  • abs(liczba) - parametrem może być dowolna liczba, metoda zwraca wartość bezwzględną z argumentu
  • więcej funkcji znajdziecie w API Javy tutaj

Wszystkie metody są statyczne, a to oznacza, że w celu ich wywołania nie musisz tworzyć obiektu, wystarczy, że metody te wywołasz poprzez klasę Math. Schematycznie:

Math.nazwa_metody(argumenty)

Zobaczmy to na praktycznym przykładzie programu, który obliczy pierwiastek z liczby, a także obliczy jej 3 potęgę.

class MathFunctions {
    public static void main(String[] args) {
        double first = 9.0;
        int second = 3;
        double sqrt = Math.sqrt(first); //pierwiastek kwadratowy
        double power = Math.pow(first, second); //9 do potęgi 3

        System.out.println("Pierwiastek z " + first + " wynosi: " + sqrt);
        System.out.println("Liczba " + first + " podniesiona do potegi " + second + " to " + power);
    }
}

Po uruchomieniu programu zobaczymy taki wynik:

java math przykład

Dzięki metodom z klasy Math wiele operacji staje się prosta. Zamiast zapisywać 9 * 9 * 9, możemy po prostu skorzystać z metody Math.pow.

Kurs Java

Ciekawym zagadnieniem o którym warto tutaj wspomnieć jest import statyczny . Dzięki jego zastosowaniu będziemy mogli pomijać przedrostki Math przed nazwami funkcji. Poniżej powyższy przykład z jego zastosowaniem.

import static java.lang.Math.*;

class MathFunctions {
    public static void main(String[] args) {
        double first = 9.0;
        int second = 3;
        double sqrt = sqrt(first); //pierwiastek kwadratowy
        double power = pow(first, second); //9 do potęgi 3

        System.out.println("Pierwiastek z " + first + " wynosi: " + sqrt);
        System.out.println("Liczba " + first + " podniesiona do potegi " + second + " to " + power);
    }
}

Jest to bardzo przydatna rzecz w przypadku, gdy w swoim programie bardzo często wywołujesz różnych funkcji matematycznych.

W klasie Math występują także dwie stałe, które reprezentują liczbyPI oraz E. Dzięki nim nie musisz pamiętać, że liczba PI to 3.14. Odwołujemy się do nich podobnie jak do metod.

Math.PI
Math.E

Wielkie liczby

Może się zdarzyć, że nawet zakres typów long, czy double nie wystarczy do naszych obliczeń. Co wtedy zrobić? W Javie istnieją dwie klasy do przechowywania naprawdę ogromnych liczb oferujące dodatkowe funkcje matematyczne i nadające się także do precyzyjnych obliczeń matematycznych, na przykład w bankowości.

  • BigInteger - klasa dla wielkich liczb całkowitych
  • BigDecimal - klasa dla wielkich liczb zmiennoprzecinkowych

Ich używanie w tradycyjnych programach nie jest zbyt wygodne, ponieważ nie można zrobić bezpośredniego przypisania wartości BigInteger przykładowo do wartości int (ani odwrotnie), pomimo że BigInteger przechowywałaby liczbę z zakresu int. Jest to spowodowane tym, że klasa BigInteger jest typem obiektowym, a do zmiennych typu int nie można przypisywać obiektów. Nie istnieje też żadna automatyczna konwersja między takimi wartościami.

W klasach BigInteger i BigDecimal znajdują się przydatne stałe reprezentujące 0 i 1:

BigInteger.ONE / BigDecimal.ONE

BigInteger.ZERO / BigDecimal.ZERO

Jeżeli natomiast chcesz utworzyć obiekt reprezentujący inne liczby, należy w takiej sytuacji skorzystać z metod BigInteger.valueOf() lub BigDecimal.valueOf() lub odpowiednich konstruktorów. W nagłówku trzeba oczywiście też zaimportować używaną klasę, ponieważ znajduje się ona w pakiecie java.math.

import java.math.BigInteger;

class BigNumbers {
    public static void main(String[] args) {
        BigInteger bigNumber = new BigInteger("123");
        System.out.println(bigNumber);
    }
}

Najpierw tworzymy obiekt BigInteger i przypisujemy go do zmiennej. Zauważ, że argument podajemy w formie Stringa . Konstruktor przyjmuje String , a nie int lub long, ponieważ z założenia liczba, którą tam podajemy może znacznie wykraczać poza zakres tych typów.

Drugi sposób na utworzenie obiektu to:

 BigInteger wielkaLiczba = BigInteger.valueOf(123123);

W tym przypadku trzeba jednak pamiętać, żeby argument metody valueOf() nie przekroczył zakresu typu long, lub double w przypadku klasy BigDecimal . Przy sposobie ze Stringiem mogą one być praktycznie nieograniczone. Aby dodać dwie ogromne liczby nie możemy korzystać ze standardowych operatorów typu +, czy *, należy w takim wypadku skorzystać z gotowych funkcji: add(), subtract(), multiply(), divide().

import java.math.BigInteger;

class BigNumbers {
    public static void main(String[] args) {
        BigInteger first = new BigInteger("123123123123123123123123123123");
        BigInteger second = new BigInteger("987654321987654321987654321987");
        BigInteger sum = first.add(second);
        System.out.println("Suma " + sum.toString());
    }
}

Obiekty BigInteger i BigDecimal są niemodyfikowalne, podobnie jak obiekty typu String. Z tego powodu wywołanie np. metody add() nie modyfikuje wartości obiektu przypisanego do zmiennej first, zamiast tego zwracany jest nowy obiekt, będący sumą dodawanych wartości.

Dzięki temu, że klasy BigInteger i BigDecimal posiadają nadpisane metody toString(), to można łatwo wyświetlić reprezentowane przez nie wartości.

Typ BigDecimal jest przydatny we wszystkich miejscach, gdzie ma dla nas znaczenie precyzja obliczeń - np. w banku. Spójrz na przykład, gdzie wykonujemy operacje na wartościach typu double:

class NormalNumbers {
    public static void main(String[] args) {
        double a = 9.5;
        double b = 4;
        double c = 0.33;
        System.out.println(a / b * c);
    }
}
big decimap przykład

W wyniku otrzymasz dziwny wynik, co wynika z tego, że liczby typu double reprezentują tylko bardzo dokładne przybliżenie liczby. Jeśli używalibyśmy typu double do przechowywania informacji o pieniądzach w banku, to przy miliardach transakcji te niedokładności w końcu wpływałyby na to, że z niektórych kont uciekałyby pieniądze (raczej niewielkie, ale jednak).

Kurs Java

Korzystając z typu BigDecimal problem ten nie występuje, ponieważ wykorzystywana jest inna reprezentacja liczb niż w przypadku double.

import java.math.BigDecimal;

class BigNumbers {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("9.5");
        BigDecimal b = new BigDecimal("4");
        BigDecimal c = new BigDecimal("0.33");

        System.out.println(a.divide(b).multiply(c));
    }
}
big decimal przykład 2

Obiekty BigDecimal zajmują jednak dużo więcej miejsca w pamięci niż wartości typu double, więc jeśli zależy Ci na szybkości obliczeń, to często lepiej jest poświęcić precyzję właśnie kosztem wyższej wydajności.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

YeeeZooo

Co daje stosowanie metody toString? Ja wyświetliłem println(a) i też było dobrze.

Slawek

W przypadku klas, gdzie przesłonięta jest metoda toString() klasy Object to zostaje ona automatycznie wywołana podczas umieszczenia jakiegoś obiektu w metodzie print(). Zapisy print(jakisBigInteger) oraz print(jakisBigInteger.toString()) są równoważne. Też zamierzałem o tym kiedyś napisać w dziale efektywne programowanie (przesłanianie metod hashCode, equals i toString w celu tworzenia bardziej uniwersalnego kodu) ;)

YeeeZooo

hmm to jeszcze dla mnie za trudne ale ważne, że działa :D

...........

Ta metoda konwertuje zapis do Stringa, który ma nieograniczoną ilość znaków, ja to tak rozumiem.

TurboKisiel

przypadkiem nie zrobiłeś literówko przy subtract ? NetBeans mnie poprawił

michaelsoft.x10.mx

Uwaga ludziska! Czasami pojawiają się literówki: import java.math.BigInteger; math powinno być pisane z dużej litery: Math A tak ogólnie to fajny kurs. Właśnie na niego trafiłem i chyba sam zacznę przygodę z JAVA.

Slawek

Nie powinno być z wielkiej litery, jest dobrze, najprościej to zobaczyć bezpośrednio w dokumentacji klasy: http://download.oracle.com/javase/1.5.0/docs/api/java/math/BigInteger.html

DDO

Z kursu import static java.lang.Math.*; W moich plikach widnieje jako Math

DDO

Sory pomylka :-) Math to klasa z pakietu java.lang. natomiast BigDecimal i BigInteger to klasy pochodzace z pakietu java.math

Kamil

<blockquote> <a href="#comment-354" rel="nofollow"> <strong><em>michaelsoft.x10.mx:</em></strong> </a> Uwaga ludziska! Czasami pojawiają się literówki: import java.math.BigInteger; math powinno być pisane z dużej litery: Math A tak ogólnie to fajny kurs. Właśnie na niego trafiłem i chyba sam zacznę przygodę z JAVA. </blockquote> Skoro jeszcze nie znasz Javy i chcesz zacząć z nią przygodę, to z jakiej racji piszesz, że na stronie są błędy, skoro jeszcze nie znasz tego języka? Nie rozumiem ludzi czasem...

Michał

BigInteger wielkaLiczba = BigInteger.valueOf(123123); Nie powinno tu być słowa 'new'? Czy też może zakładamy, że obiekt wielkaLiczba już jest utworzony?

Blaise

Jest dobrze. Metoda valueOf powołuje obiekt BigInteger.

Michał

cytat z zad,1.4:"-pierwiastek z liczby a do potęgi b." Liczba a jest ujemna, więc jak to pierwiastek z niej? (tu rozumiem polecenie jako: (sqrt(a))^b Nawet zakładając, że w poleceniu chodzi o sqrt(a^b), to potrzeba jeszcze założyć, że b jest parzysta, nie mam racji?

Michał

Ok, nie doczytałem zadania do końca :), jest git. Chociaż myślę, że można by to, że chodzi o sqrt(a^b) jakoś zaakcentować, bo np ja na początku zinterpretowałem to jako (sqrt(a))^b.

Aika

A można porobić sobie różne działania i kombinacje i zobaczyć, że czasami wychodzi NaN. NaNy bywają całkiem przydatne.

Michał

W dokumentacji BigInteger szukając potęgowania natrafiłem na motodę xor (napisali, że a.xor(b) zwraca a^b, co skojarzyłem z potęgowaniem). Mógłby mi ktoś wytłumaczyć o co w niej chodzi? Zdaje się, ze ogólnie XOR to spójnik logiczny w rodzaju 'albo'. Więc co to ma do liczb?! I dlaczego a.xor(b) zwraca BigInteger, skoro to niby spójnik logicznny"? Niech mi to ktoś wytłumaczy, bo już tracę nerwy. http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigInteger.html

Slawek

<blockquote> <a href="#comment-972" rel="nofollow"> <strong><em>Michał:</em></strong> </a> <p>BigInteger wielkaLiczba = BigInteger.valueOf(123123);</p> <p>Nie powinno tu być słowa ‘new’?<br> Czy też może zakładamy, że obiekt wielkaLiczba już jest utworzony?</p> </blockquote> metoda valueOf() jest metodą statyczną - wywoływaną na rzecz klasy, a nie konkretnej instancji. Nie trzeba tworzyć obiektu, aby ją wywołać. Jest to wykorzystywane np we wzorcu projektowym zwanym singletonem. XOR jest dobrze wytłumaczony na wikipedii. Nie ma przy tym filozofii, jeśli ktoś miał choćby podstawy logiki (chyba alternatywa i koniunkcja są nadal w gimnazjum?). Generalnie wykorzystuje się to głównie przy bramkach logicznych - na studiach będziecie mieli okazję wykorzystać to w układach scalonych. W operacji a XOR b otrzymujemy true jeśli a i b są różnymi wartościami (true false, lub false true), jeśli są takie same otrzymujemy false (true true, lub false false) Co do pierwiastka, to faktycznie zabrakło 1 słowa. W tym przypadku pierwiastek z liczby ujemnej zwróci NaN, ale na studiach można się dowiedzieć takich rzeczy, że pierwiastek z liczby ujemnej jak najbardziej istnieje, tyle, że w dziedzinie liczb zespolonych, a nie rzeczywistych :) i taka prośba, żeby nie pisać aż tylu komentarzy pod sobą :P

Michał

Dzięki za odpowiedź! Co do Xor: rozumiem ten spójnik, tyle że w dokumentacji to jest metoda która zwraca BigInteger, a jej argumentem też jest BigInteger. To czego nie rozumiem, to jak można wstawić spójnik logiczny pomiędzy liczby. btw to jestem studentem matematyki ;)

Slawek

Istnieje operator xor dla liczbowych typów prostych w postaci ^, czyli np a xor b w javie to a^b i zwraca 0, lub 1. W przypadku BigInteger jak zauważyłeś wywołujemy metodę na rzecz obiektu.

Michał

Może tak będzie najprościej wytłumaczyć o co mi chodzi: import java.math.BigInteger; public class Kalkulator15{ public static void main(String[] args){ BigInteger a= new BigInteger("110"); BigInteger b= new BigInteger("-10"); System.out.println("a^b="+a.xor(b)); } } U mnie konsola wyświetla: a^b=-104. Po prostu chciałbym wiedzieć co ta liczba oznacza i skąd się wzięła. :)

Slawek

ah, bo widzisz tutaj chodzi o operacje na bitach :) Przykład, który podałeś, akurat jest kiepski do tłumaczenia, bo dochodzi tutaj kwestia kodowania liczb ujemnych (szczerze mówiąc po zapisaniu tego na kartce to sam tego nie pamiętam :P ). Ale dla przykładu zapisujesz binarnie 10 - 1010, oraz 6 - 0110. Jeśli zrobisz 10 XOR 6, to porównujesz kolejne bity i ostatecznie otrzymujesz 1100, czyli 12.

Michał

Dobre, dzięki za wyjaśnienie :)

Eryk

Mam mały problem, może ktoś mi to wyjaśni... Napisałem wszystko dokładnie tak jak w pierwszym przykładzie, ale cały czas wyskakiwał błąd "cannot find a symbol" i konsola wskazywała na kropkę po "Math" w linijce double pierwiastek = Math.sqrt(liczba); co ciekawe problem znikł, jak wykonałem ten import statyczny, chociaż nic (poza wykoszeniem tego Math.) nie zmieniałem. Koniec końców się udało, ale nie rozumiem, dlaczego nie działało za pierwszym razem...

Krzysiek

Mam pytanie bo moze ja cos źle robie. Jak przy zmiennych int chcieliśmy otrzymać dokładny wynik z dzielenia to jedną z nich musieliśmy zapisać jako double i wynik również jako double. Ale jak otrzymać dokładny wynik z dzielenia w przypadku BigInteger. BigDecimal "nie lubi" BigInteger i albo działanie robimy na jednym typie albo wyłącznie na drugi. A jak do obiektu BigDecimal wprowadzę liczbę całkowitą to co prawda kompiluje, ale przy uruchomieniu wyświetla że jest to jakiś wyjątek zamiast wyświetlić wynik obliczenia.

Slawek

Musisz: -albo utworzyć obiekt BigDecimal bezpośrednio z obiektu BigInteger (jest odpowiedni konstruktor), czyli jakiśBigDecimal.divide(new BigDecimal(jakiśBigInteger)); -albo zapisać wartoś BigInteger do jakiegoś Stringa (wykorzystując toString()) i na podstawie tego utworzyć BigDecimal - sprowadza się to do sposobu numer 1, tylko więcej roboty.

mietek

Dlaczego po suma.toString dajemy nawias "()"?

Jędrzej

W JAVA'ie(w przeciwieństwie do np. dephi) funkcje i procedury MUSZĄ mieć nawiasy.

Leo

"Odkryłem", że wpisując w tym nawiasie 2, 8 lub 16 zwracana jest liczba w systemie dwójkowym, ósemkowym lub szesnastkowym.

mietek

I jeszcze jedno pytanie. Dlaczego jeżeli dzielę dwie duże liczby to gdy dzielę mniejszą przez większą wynik jest równy 0 a gdy wieksza przez mniejsza to wynik jest zaokrąglany do liczby całkowitej?

Krzysiek

Poprostu pokozuje Ci wynik w zaokrągleniu bo BigInteger to klasa stałoprzecinkowa, analogicznie można ją porównać do zmiennej int i tak samo jak tam gdzie aby otrzymać wynik z przecinkiem musieliśmy użyć w działaniu choćby jedną zmiennoprzecinkową double to tu musimy użyć klasy zmiennoprzecinkowej BigDecimal. Też się z tym męczyłem (patrz post #20) ale po wskazówkach Sławka rozbroiłem to:) Problem tylko w tym, że int i double same konwertują wynik do double a tu czyli w przypadku klas musisz użyć jakby obudowania obiektu BigInteger obiektem BigDecimal. Przykład: import java.math.BigInteger; import java.math.BigDecimal; public class Test{ public static void main(String[] args){ BigDecimal a = new BigDecimal("1.8000000000000000000000"); BigInteger b = new BigInteger("200000000000000"); BigDecimal c = a.divide(new BigDecimal(b)); System.out.println(c); } } Konsola wyrzuci wynik 9.0000000E-15, ale uważaj bo jak z dzielenia będzie wychodziła po przecinku nieskończoność, to ci nie obliczy żadnego w zaokrągleniu wyniku tylko zgłosi jakiś wyjątek. Tego jeszcze nie rozbroiłem, może Sławek coś by doradził?

Piotr

Mam problem, oto on: ______________________________________ package Pakiet_pk; public class PierwszaKrew { public static void main(String[] args) { System.out.printf("Pi"); System.out.printf("Pi =" + "%6.5f". Math.PI); # I TUTAJ WYWALA MI BŁĄD } } _______________________________________________ Dlaczego? "Pracuję" - w Eclipsie

Kelzaer

Spróbuj w ten sposób: <code> public class PierwszaKrew{ public static void main(String[] args) { System.out.printf("Pi = %6.5f"+"\n", Math.PI); } </code>

Marcin

a wie może ktoś jak zrobić pierwiastek z bardzo dużej liczby (BigInteger), powiedzmy ze pierwiastek kwadratowy lub trzeciego stopnia, w api szukałem takiej funkcji ale nie znalazłem

gandy

Nie bardzo rozumiem dlaczego deklaracje dotyczące importu różnią się. Przykładowo import static java.lang.Math.* ; import java.math.BigInteger ; Pytań mam kilka.Proszę o odpowiedź. Co powoduje w tym przypadku wyraz "static" w pierwszej z dwóch linii?(w drugiej go nie ma i jest dobrze)Dlaczego w pierwszej linii "Math" jest pisany z dużej litery, a w drugiej linii z małej. Zakładam,że w drugiej linii z biblioteki "java.math" importowana jest klasa "BigInteger"- czy dobrze to rozumiem? Jeśli tak to z jakiego powodu w pierwszej linii występuje słowo "lang".

Piki

Dołączam się do pytań ;)

gandy

Jeszcze dla sprecyzowania - chodzi mi o to co ten import statyczny (słowo "static") rzeczywiście powoduje w porównaniu z brakiem takiego importu np w zastosowaniu do klasy "BigInteger"

Paweł

Fajne operacje zauważyłem że zamiast double liczba = 9.0 double pierwiastek = Math.sqrt(liczba); System.out.println("Pierwiastek z "+liczba+" wynosi: "+pierwiastek); można użyć wprost double liczba = 9.0 System.out.println("Pierwiastek z "+liczba+" wynosi: "+Math.sqrt(liczba));

Pawel

witam jak wydrukowac kilka bigInteger w jednym system.out.println? BigInteger big1=new BigInteger("10000000000000000000"); BigInteger big2=new BigInteger("10000000000000000000"); BigInteger suma=big1.add(big2); BigInteger rozn=big1.subtract(big2); System.out.println(suma.toString()+rozn.toString()); //to dziala System.out.println(suma.toString()+\n+rozn.toString()); //nie dziala System.out.println(suma.toString()+\nrozn.toString()); //nie dziala 2 ostatnie linijki nie działają? dlaczego?

Sławek Ludwiczak

\n musi być w znakach cudzysłowu.

Nick

niema przykładu z metodami któych miało się użyć do zadania 1.5

Chasil

Trochę kreatywności...

Garay

Jak obliczyć funkcje trygonometryczne z BigDecimal?

Nick

W jaki sposób zaokrąglić BigDecimal do określonej liczby miejsc po przecinku . mam problem przy obliczaniu pierwiastków oraz np przy 2/3 . prosze o podpowiedź.

Grzegorz

Dzięki za ten super kurs! zawsze chciałem się nauczyć choćby podstaw programowania i dzięki Tobie stało się to możliwe ;) Mam taką jedną uwagę, nie odnośnie tej lekcji ale ogólnie, w niektórych lekcjach posługujesz się terminologią i pojęciami, które są wyjaśniane dopiero w późniejszej fazie kursu, czy mógłbyś zrobić taki hmm.. słownik pojęć oraz np podstawowych komend tak by można sobie je bylo wydrukować i mieć zawsze pod ręką? To naprawdę ułatwiło by sprawę z tym wszystkim ;) dzięki wielkie za kurs!

Sławek Ludwiczak

Tak myślałem o tym i na pewno to zrobię. W kolejce jest jeszcze stworzenie mapy strony ze spisem treści, bo można się obecnie nieco zagubić na stronie.

Adrianus123

public class kal{ public static void main(String[] args){ double liczba = 9.0; int b = 3; System.out.println("Pierwiastek z "+liczba+" wynosi: "+Math.sqrt(liczba)); System.out.println("Liczba "+liczba+" podniesiona do potegi "+b+" to "+Math.pow(liczba, b)); } } czy ten sposób obliczania w Javie jest zły po co dodatkowe zmienne w systemie

Maciej Wajdzik

Cześć, w końcu mogę się czegoś nauczyć. lepiej późno niż wcale :D import java.math.BigInteger; import java.math.BigDecimal; public class Funkcja{ public static void main(String[] args){ double liczba = 9.0; int liczba2 = 3; //wejściowe double pierwiastek = Math.sqrt(liczba); double potęga = Math.pow(liczba, liczba2); System.out.println("Pierwiastek z "+liczba+" wynosi: "+pierwiastek); System.out.println("Liczba "+liczba+" podniesiona do potęgi"+liczba2+" to "+potęga); //tutaj zacznę wielkie liczby BigInteger wielkaLiczba = new BigInteger("121212131444121233"); System.out.println(wielkaLiczba.toString()); BigInteger wielkaLiczba2 = BigInteger.valueOf(123123); System.out.println(wielkaLiczba2.toString()); //coś nowego BigInteger a = new BigInteger("15454"); BigDecimal b = new BigDecimal("4325.654"); BigInteger suma = a.add(b); //tutaj nie łyka bo BigInteger? System.out.println("Liczba a "+a+" oraz liczba b "+b+" ich suma to "+suma.toString()); } } Jak dodać BigInteger do BigDecimal? Jakbyś to mógł zapisać byłbym wdzięczny :D Pozdrawiam

Nitr0Skay

Witam, mam pewien problem. Bawiłem się trochę tym BigInteger i BigDecimal i w efekcie napisałem taki program : http://pastebin.com/DV4bazzN Po Naciśnięciu Run, pierwsza część programu (Ta z BigInteger) działa poprawnie, tzn na konsoli pojawia się taki wynik: Suma = 15017102119021233092 Różnica = 3892212989891860000 Mnożenie = 52591008523607269227049550120148970116 Dzielenie = 1 Ale zaraz pod tym, konsola zwraca błąd (To w części z BigDecimal) następujący: Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source) at Lekcja6.main(Lekcja6.java:24) I w efekcie, cała treść konsoli po skompilowaniu programu wygląda tak: Suma = 15017102119021233092 Różnica = 3892212989891860000 Mnożenie = 52591008523607269227049550120148970116 Dzielenie = 1 Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source) at Lekcja6.main(Lekcja6.java:24) Moje pytanie brzmi następująco: Co może być powodem tego błędu i jak to mogę naprawić ? Tak btw. Zarejestrowałem się na forum i aktywowałem swoje konto, ale nie mogę zakładać tematów. Dlaczego ?

Janosch

Hej, żeby poprawnie podzielić BigDecimal/BigDecimal musisz określić skalę oraz sposób zaokrąglania, np. (w przykładzie poniżej c i d są zmiennymi typu BigDecimal) c/d = c.divide(d,2,RoundingMode.HALF_UP).toString(); Więcej informacji znajdziesz tutaj: http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html#divide%28java.math.BigDecimal,%20int,%20java.math.RoundingMode%29

Marcin

a co daje te .toString jak nie było tego to ten sam wynik wychodzi a z tego co przeczytałem to zmienia format jak tak to z jakiego formatu na jaki?

loki

A jak to jest ze znakiem -5^2=-25 w konsoli mam 25

krypsa

import static java.lang.Math.*; public class Funkcje5{ public static void main(String[] args){ int a=10; int b=2; double potega=Math.pow(a,b); double wart_bezwgl=Math.abs(a); double pierwiastek=Math.sqrt(potega); System.out.println=("Liczba a podniesiona do potegi b = "+potega); System.out.println=("Wartosc bezwgledna z liczba a = "+wart_bezwgl); System.out.println=("Pierwiastek liczby a podniesionej do potegi b = "+pierwiastek); } } dlaczego mam wyswietlany blad przy znaku "." miedzy "out" i "println". kompilator pokazuje mi 3 bledy i to wszystkie w tym samym miejscu. czy kyos moze mi wytlumaczyc dlaczego?

Damian

http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println%28%29 println to metoda, a nie zmienna na którą możesz przyjąć jakąś wartość...

snt.banzai

skasuj po prostu znaki równości po println

LOLO

Nie wiem, dopiero zaczynam ale wydaje mi się, że niepotrzebnie dajesz znak "=" po System.out.println

Husky

double sina = asin(alfa); double cosa = acos(alfa); System.out.println("sinus kata alfa =\t" + sina); System.out.println("cosinus kata alfa =\t" + cosa); ....... double jedynka_trygonometryczna = qsina + qcosa; Jako sinus i cosinus, a także sumę ich kwadratów program zwraca jakiś NaN. Z innych komentarzy wiem że to jes naturalne, i że "NaNy są czasem przydatne", w tym jednak wypadku chciałbym mieć zamiest nich liczby. Czy ktoś wie jak to zrobić? Od razu dodam, że alfa nie jest ujemna.

adik

do czego konkretnie służą te funkcje? add(), subtract(), multiply(), divide() add() to chyba dodawanie? A reszta?

luka

add(), subtract(), multiply(), divide() dodaj, odejmij, pomnóż, podziel. GOOGLE TRANSLATOR

Damian

https://translate.google.pl/#en/pl/subtract%28%29%3B%0Amultiply%28%29%3B%20%0Adivide%28%29%3B JAVA to język w którym naprawdę warto znać angielski (nazwy funkcji z reguły znaczą tyle co ich przeznaczenie), albo chociaż sprawnie posługiwać się słownikiem :)

szczepan

Mój kod ad. ćw. 1.4 -&gt; http://ideone.com/GJscPN wynik potęgowania to "-Infinity" (rozumiem że to wina typu double w zmiennej 'c'). Jeśli zmienię na long ( http://ideone.com/olELGM ) to wynik będzie prawidłowy. Szkoda tylko że nie wiem czemu w trzecim działaniu wynik jest NaN?

Marta

Nawet gdy kopiuję kod : public class Funkcje{ public static void main(String[] args){ double liczba = 9.0; int b = 3; double pierwiastek = Math.sqrt(liczba); double potega = Math.pow(liczba, b); System.out.println("Pierwiastek z "+liczba+" wynosi: "+pierwiastek); System.out.println("Liczba "+liczba+" podniesiona do potegi "+b+" to "+potega); } } wyskakują błędy, wszystkie tyczą się samej funkcji : Math.nazwa_metody(argumenty) Funkcje.java:6: error: cannot find symbol double potega = Match.pow(liczba, b); symbol: method pow(double, int) location class Math .\Math.java:6: error: cannot find symbol double potega = Math.pow(liczba2, liczba1); symbol: method pow(double, int) location class Math .\Math.java:7: error: cannot find symbol double pierwiastek = Math.sqrt(liczba1); symbol: method sqrt(int) location: class Math W przypadku importu statycznego wszystko jest ok.

lolo

Nie rozumiem o co Ci chodzi. Przecież na samym końcu piszesz, że jak zaimportujesz to wszystko działa.

Marta

Gdy próbuje tak: public class Funkcje{ public static void main(String[] args){ double liczba = 9.0; int b = 3; double pierwiastek = Math.sqrt(liczba); double potega = Math.pow(liczba, b); System.out.println(„Pierwiastek z „+liczba+” wynosi: „+pierwiastek); System.out.println(„Liczba „+liczba+” podniesiona do potegi „+b+” to „+potega); } } wyskakują błędy. Gdy robię tak: import static java.lang.Math.*; public class Funkcje{ public static void main(String[] args){ double liczba = 9.0; int b = 3; double pierwiastek = sqrt(liczba); double potega = pow(liczba, b); System.out.println("Pierwiastek z "+liczba+" wynosi: "+pierwiastek); System.out.println("Liczba "+liczba+" podniesiona do potegi "+b+" to "+potega); } } błędów nie ma.

lolo

Jak tak patrzę na te błędy to trochę nie pasują do kodu który wkleiłaś. np. Funkcje.java:6: error: cannot find symbol double potega = Match.pow(liczba, b); sugeruje, że napisałaś Match.pow(liczba, b); Math przez "ch" a nie przez "h" dodatkowo sugeruje to, że linijka double potega = Match.pow(liczba, b); znajduje się nad double pierwiastek = Math.sqrt(liczba1); a w kodzie jest na odwrót.

Jędrzej

Wykonując zadanie 1.4, gdy użyłem zmiennych spoza zakresu int: a = 123; b = -321; zamiast uzyskać nieskończoność w wyniku działania funkcji pow oraz sqrt, dostałem wynik 0. Dlaczego?

Piotr.java

Dlaczego API javy nie działa?????

Roman

Witam - próbuję swoich sił w Javie - kurs jest świetny i bardzo przystępny - należą się podziękowania Autorowi! Niestety napotkałem na małą niedogodność - link podany w tej lekcji nie działa - proszę o korektę: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html

k2marko

http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html

Maciej

import java.math.BigInteger; public class Kalkulator3{ public static void main(String[] args){ BigInteger c = new BigInteger("-123123123123123123123"); BigInteger d = new BigInteger("100000000000000000000"); System.out.println("c+d= " +c.add(d).toString()); System.out.println("c-d= " +c.subtract(d).toString()); System.out.println("c*d= " +c.multiply(d).toString()); System.out.println("c/d= " +c.divide(d).toString()); System.out.println("c^d= " +c.pow(d).toString()); // TU MAM BŁĄD System.out.println("Wartosc bezwzgledna z a to " +c.abs()); } } Kalkulator3.java:18: error: method pow in class BigInteger cannot be applied to given types; required: int found: BigInteger reason: actual argument BigInteger cannot be converted to int by method invocation conversion 2 errors Generalnie rozumiem o co chodzi, ale jak zrobić, żeby to działało bo np. jeśli zamiast d podstawię jakąkolwiel liczbę to całość się ładnie kompiluje.

Marcin Kunert

Masz odpowiedź w komunikacie o błędzie: required: int found: BigInteger Spróbuj: System.out.println("c^d= " +c.pow(d.intValue()).toString());

Maciej

Ooo fajne :) Nie sądziłem że mogę zastosować zmianę na int skoro wynik będzie tak duży a int obsługuje zakres do 2 147 483 647, chyba coś nie kumam do końca. A co ciekawe: System.out.println(„c^d= ” +c.pow(d.intValue()).toString()); // przy takim zapisie po kompilacji w cmd wyskakuje mi: c^10= 800564...itd. zamiast c^d= 800564...itd. :)

Janosch

Bardzo fajnie to omawiasz :) Aż człowiek czuje motywację do nauki Javy, która wcale nie wydaje się taka straszna! :)

ichika60h

BigInteger a = new BigInteger("123123123123123123123123123123"); BigInteger b = new BigInteger("987654321987654321987654321987"); BigInteger suma = a.add(b); Dlaczego nie deklarujemy poprzez new skoro potrzebujemy obiektu?

artur

Potrzebuję pomocy, wie moze ktos dlaczego w ponizszym programie zle zostaje obliczona wartosc zmiennej c podniesionej do potegi 1/3. W wyniku pokazuje 1 zamiast 3. :( import static java.lang.Math.*; public class Zadanie { public static void main (String [] args) { double a,b,c; a = 3; b=9; c=27; System.out.println(" pierwiastek kwadratowy z a = " + sqrt (a)); System.out.println(" pierwiastek kwadratowy z b = " + sqrt (b)); System.out.println(""+pow(c,1/3)); System.out.println("Czy pierwiastek z a jest wiekszy od pierwiastka z b? " + (sqrt(a)&gt;sqrt(b))); } }

lolo

spróbuj: pow(c, 1/3.0)

artur

dziekuje działa!!

lolo

Następnym razem jak będziesz miał problem z programem to pisz na forum, tam możesz użyć tagu [shcode=java] i kod będzie czytelniejszy.

Nawias

Dlaczego przy wyświetlaniu podajemy "+liczba+"? Chodzi mi głównie o te plusy.

Lolo

Chodzi o doklejenie wartości zmiennej do stałego ciągu znaków.

xCraftRayX

więcej funkcji znajdziecie w API Javy "tutaj" &lt;-- aktualizujcie :D

olekolek1000

Co to jest ,,new'' ? Wcześniej tego nie było, a tutaj nic nie było wytłumaczone.

ssss

import java.util.Arrays; public class Arrays { public static void main(String[] args) { int[] tablica = {1, 4, 2, 7, 3}; int[] kopia new int[5]; //kopia = tablica; kopia = Arrays.copyOf(tablica, tablica.length); tablica[0]=1000; Arrays.sort(kopia); System.out.println(Arrays.toString(tablica)); System.out.println(Arrays.toString(kopia)); } } Dlaczego nie mogę skompilować tego kodu, u innych działa kompilacja?

Lolo

wystarczy czytać informacje które zwraca kompilator i byś wiedział, że w linii 9 coś nie gra. A po przyjrzeniu się jej, zauważyłbyś brak znaku przypisanie "=" w niej.