IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

17. diel - Matematické funkcie v Jave a knižnica Math

V minulej lekcii, Cykly v Jave do tretice - do-while, break a continue , sme ucelili naše znalosti cyklov ďalšími konštrukciami a kľúčovými slovami, na ktoré môžeme naraziť v cudzích zdrojových kódoch.

Naša on-line výučba Javy teraz vlastne ešte len začína, avšak v tomto kurze s tutoriálmi o tých najzákladnejších konštrukciách jazyka sme už na konci. Som rád, že sme sa úspešne dostali až sem, ďalšia sekcia sa totiž bude venovať objektovo orientovanému programovaniu. Budeme tam vytvárať naozaj zaujímavé aplikácie a aj jednu hru. Sekciu zakončíme odľahčujúcim článkom s prehľadom matematických funkcií, ktoré sa nám v našich programoch určite budú v budúcnosti hodiť.

Trieda Math

Základné matematické metódy sú v Jave obsiahnuté v triede Math. Trieda nám poskytuje dve základné konštanty: PI a E. Konštanta PI je pochopiteľne číslo Pí (3.1415...) a E je Eulerovo číslo, teda základ prirodzeného logaritmu (2.7182...). Asi je jasné, ako sa s triedou pracuje, ale pre istotu si na ukážku konštanty vypíšme do konzoly:

System.out.println("Pi: " + Math.PI);
System.out.println("e: " + Math.E);

Vidíme, že všetko voláme na triede Math.

Konzolová aplikácia
Pi: 3.141593
e: 2.718282

Poďme si teraz popísať metódy, ktoré trieda poskytuje:

Metódy na triede Math

Metódy min() a max()

Začnime tým jednoduchším :-) Obe metódy berú ako parameter dve čísla ľubovoľného dátového typu. Metóda min() vráti to menšie, metóda max() to väčšie z nich.

Metódy round(), ceil() a floor()

Všetky tri metódy sa týkajú zaokrúhľovania. Metóda round() berie ako parameter desatinné číslo a vracia zaokrúhlené číslo typu double tak, ako to poznáme zo školy (od 0.5 hore, inak dole). Metóda ceil() zaokrúhli vždy nahor a metóda floor() vždy nadol.

Metódu round() budeme určite potrebovať často, ďalšie metódy som v praxi často použil napr. pri zisťovaní počtu stránok pri výpise komentárov v knihe návštev. Keď máme 33 príspevkov a na stránke ich je vypísaných 10, budú teda zaberať 3.3 stránok. Výsledok musíme zaokrúhliť nahor, pretože v reáli budú stránky samozrejme 4.

Metódy abs() a signum()

Obe metódy berú ako parameter číslo ľubovoľného typu. Metóda abs() vráti jeho absolútnu hodnotu a signum() vráti podľa znamienka -1, 0 alebo 1 (pre záporné číslo, nulu a kladné číslo).

Metódy sin(), cos() a tan()

Ide o klasické goniometrické funkcie, ako parameter berú uhol typu double v radiánoch, nie v stupňoch. Pre konverziu stupňov na radiány vynásobíme stupne * (Math.PI/180). Výstupom je opäť double.

Metódy acos(), asin() a atan()

Opäť klasické cyklometrické metódy (arkus funkcie), ktoré podľa hodnoty goniometrickej funkcie vrátia daný uhol. Parametrom je hodnota dátového typu double, výstupom uhol v radiánoch (tiež typu double). Ak si prajeme mať uhol v stupňoch, vydelíme radiány vzorcom / (180 / Math.PI).

Metódy pow() a sqrt()

Metóda pow() berie dva parametre typu double, prvý je základ mocniny a druhý exponent. Ak by sme teda chceli spočítať napr. 23, kód by bol nasledovný:

System.out.println(Math.pow(2, 3));

Skratka sqrt je zo SQuare RooT a vráti teda druhú odmocninu z daného čísla typu double. Obe funkcie vracajú výsledok ako typ double.

Metódy exp(), log() a log10()

Metóda exp() vracia Eulerovo číslo umocnené na daný exponent. Ďalej metóda log() vracia prirodzený logaritmus daného čísla. Metóda log10() vracia potom dekadický logaritmus daného čísla.

V zozname metód nápadne chýba ľubovoľná odmocnina. My ju však dokážeme spočítať aj na základe funkcií, ktoré Math poskytuje.

Vieme, že platí: 3. odmocnina z 8 je 8 1/3. Môžeme teda napísať:

System.out.println(Math.pow(8, (1.0/3.0)));

Je veľmi dôležité, aby sme pri delení napísali aspoň jedno číslo s desatinnou bodkou, inak bude Java predpokladať celočíselné delenie a výsledkom by v tomto prípade bolo 80 = 1.

Delenie

Programovacie jazyky sa často odlišujú tým, ako v nich funguje delenie čísel. Túto problematiku je nutné dobre poznať, aby ste potom neboli (nepríjemne) prekvapení. Napíšme si jednoduchý program:

int a = 5 / 2;
double b = 5 / 2;
double c = 5.0 / 2;
double d = 5 / 2.0;
double e = 5.0 / 2.0;
// int f = 5 / 2.0;

System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);

V kóde niekoľkokrát delíme 5 / 2, čo je matematicky 2.5. Iste ale tušíte, že výsledok nebude vo všetkých prípadoch rovnaký. Trúfnete si tipnúť, čo kedy vyjde? Skúste to :)

Kód by sa nepreložil kvôli riadku s premennou f, preto sme ho zakomentovali. Problém je v tom, že v tomto prípade vyjde desatinné číslo, ktoré sa snažíme uložiť do čísla celého (typ int). Výstup programu je potom nasledujúci:

Konzolová aplikácia
2
2.0
2.5
2.5
2.5

Vidíme, že výsledok delenia je niekedy celočíselný a niekedy reálny. Pritom vôbec nezáleží na dátovom type premennej, do ktorej výsledok ukladáme, ale na dátovom type čísel, ktoré delíme. Pokiaľ je jedno z čísel desatinné, je výsledok vždy desatinné číslo. Dve celé čísla vrátia vždy celé číslo. Dajte si na to pozor napr. keď budete počítať priemer, pre desatinný výsledok je nutné aspoň jednu premennú pretypovať na desatinné číslo:

int sum = 10;
int count = 4;
double diameter = (double)sum / count;

Napríklad v jazyku PHP je výsledok delenia vždy desatinný. Až budete deliť v inom programovacom jazyku ako v Jave, zistite si, ako delenie funguje, než ho použijete.

Zvyšok po celočíselnom delení

V našich aplikáciách môžeme často potrebovať zvyšok po celočíselnom delení (tzv. modulo). V našom príklade 5 / 2 je celočíselný výsledok 2 a modulo 1 (zvyšok). Modulo sa často používa na zistenie, či je číslo párne (zvyšok po delení 2 je 0), keď chcete napr. vyfarbiť šachovnicu, zistiť odchýlku vašej pozície od nejakej štvorcovej siete a podobne.

V Jave a všeobecne v céčkových jazykoch zapíšeme modulo ako %:

System.out.println(5 % 2); // result is 1

Tak to by sme mali. V kurze Základná konštrukcia jazyka Java nájdete ešte niekoľko ďalších príkladov na precvičenie, ktoré určite odporúčame vypracovať. Na kurz teraz nadväzujú Základy objektovo orientovaného programovania v Jave. Nabudúce si teda predstavíme objektový svet a pochopíme mnoho vecí, ktoré nám až doteraz boli utajované :-)

V nasledujúcom kvíze, Kvíz - Pokročilé podmienky a cykly v Jave, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 2x (6 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Cykly v Jave do tretice - do-while, break a continue
Všetky články v sekcii
Základné konštrukcie jazyka Java
Preskočiť článok
(neodporúčame)
Kvíz - Pokročilé podmienky a cykly v Jave
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity