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í.

Lekce 17 - Matematické funkce v Javě a knihovna Math

V minulé lekci, Cykly v Javě potřetí - do-while, break a continue, jsme ucelili naše znalosti cyklů dalšími konstrukcemi a klíčovými slovy, na která můžeme narazit v cizích zdrojových kódech.

Naše on-line výuka Javy teď vlastně teprve začíná, nicméně v tomto kurzu s tutoriály o těch nejzákladnějších konstrukcích jazyka jsme již u konce. Jsem rád, že jsme se úspěšně dostali až sem, další sekce se totiž bude věnovat objektově orientovanému programování. Budeme tam vytvářet opravdu zajímavé aplikace a i jednu hru. Sekci zakončeme odlehčujícím článkem s přehledem matematických funkcí, které se nám v našich programech jistě budou v budoucnu hodit.

Třída Math

Základní matematické metody jsou v Javě obsaženy ve třídě Math. Třída nám poskytuje dvě základní konstanty: PI a E. Konstanta PI je pochopitelně číslo Pí (3.1415...) a E je Eulerovo číslo, tedy základ přirozeného logaritmu (2.7182...). Asi je jasné, jak se s třídou pracuje, ale pro jistotu si na ukázku konstanty vypišme do konzole:

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

Vidíme, že vše voláme na třídě Math.

Konzolová aplikace
Pí: 3.141593
e: 2.718282

Pojďme si nyní popsat metody, které třída poskytuje:

Metody na třídě Math

Metody min() a max()

Začněme s tím jednodušším :) Obě metody berou jako parametr dvě čísla libovolného datového typu. Metoda min() vrátí to menší, metoda max() to větší z nich.

Metody round(), ceil() a floor()

Všechny tři metody se týkají zaokrouhlování. Metoda round() bere jako parametr desetinné číslo a vrací zaokrouhlené číslo typu double tak, jak to známe ze školy (od 0.5 nahoru, jinak dolů). Metoda ceil() zaokrouhlí vždy nahoru a metoda floor() vždy dolů.

Metodu round() budeme jistě potřebovat často, další metody jsem prakticky často použil např. při zjišťování počtu stránek při výpisu komentářů v knize návštěv. Když máme 33 příspěvků a na stránce jich je vypsáno 10, budou tedy zabírat 3.3 stránek. Výsledek musíme zaokrouhlit nahoru, protože v reálu stránky budou samozřejmě 4.

Metody abs() a signum()

Obě metody berou jako parametr číslo libovolného typu. Metoda abs() vrátí jeho absolutní hodnotu a signum() vrátí podle znaménka -1, 0 nebo 1 (pro záporné číslo, nulu a kladné číslo).

Metody sin(), cos() a tan()

Klasické goniometrické funkce, jako parametr berou úhel typu double, který považují v radiánech, nikoli ve stupních. Pro konverzi stupňů na radiány stupně vynásobíme * (Math.PI/180). Výstupem je opět double.

Metody acos(), asin() a atan()

Opět klasické cyklometrické metody (arkus funkce), které podle hodnoty goniometrické funkce vrátí daný úhel. Parametrem je hodnota datového typu double, výstupem úhel v radiánech (také typu double). Pokud si přejeme mít úhel ve stupních, vydělíme radiány vzorcem / (180 / Math.PI).

Metody pow() a sqrt()

Metoda pow() bere dva parametry typu double, první je základ mocniny a druhý exponent. Pokud bychom tedy chtěli spočíst např. 23, kód by byl následující:

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

Zkratka sqrt je pro SQuare RooT a vrátí tedy druhou odmocninu z daného čísla typu double. Obě funkce vrací výsledek jako typ double.

Metody exp(), log() a log10()

Metoda exp() vrací Eulerovo číslo, umocněné na daný exponent. Dále metoda log() vrací přirozený logaritmus daného čísla. Metoda log10() vrací potom dekadický logaritmus daného čísla.

V seznamu metod nápadně chybí libovolná odmocnina. My ji však dokážeme spočítat i na základě funkcí, které Math poskytuje.

Víme, že platí: 3. odmocnina z 8 je 81/3. Můžeme tedy napsat:

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

Je velmi důležité, abychom při dělení napsali alespoň jedno číslo s desetinnou tečkou, jinak bude Java předpokládat celočíselné dělení a výsledkem by v tomto případě bylo 80 = 1.

Dělení

Programovací jazyky se často odlišují tím, jak v nich funguje dělení čísel. Tuto problematiku je nutné dobře znát, abyste nebyli poté (nepříjemně) překvapeni. Napiš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ódu několikrát dělíme 5 / 2, což je matematicky 2.5. Jistě ale tušíte, že výsledek nebude ve všech případech stejný. Troufnete si tipnout si co kdy vyjde? Zkuste to :)

Kód by se nepřeložil kvůli řádku s proměnnou f, proto jsme ho zakomentovali. Problém je v tom, že v tomto případě vyjde desetinné číslo, které se snažíme uložit do čísla celého (typ int). Výstup programu je poté následující:

Konzolová aplikace
2
2.0
2.5
2.5
2.5

Vidíme, že výsledek dělení je někdy celočíselný a někdy reálný. Přitom vůbec nezáleží na datovém typu proměnné, do které výsledek ukládáme, ale na datovém typu čísel, které dělíme. Pokud je jedno z čísel desetinné, je výsledek vždy desetinné číslo. Dvě celá čísla vrátí vždy zas celé číslo. Dejte si na to pozor např. když budete počítat průměr, pro desetinný výsledek je nutné alespoň jednu proměnnou přetypovat na desetinné číslo:

int soucet = 10;
int pocet = 4;
double prumer = (double)soucet / pocet;

Například v jazyce PHP je výsledek dělení vždy desetinný. Až budete dělit v jiném programovacím jazyce než v Javě, zjistěte si, jak dělení funguje, než jej použijete.

Zbytek po celočíselném dělení

V našich aplikacích můžeme často potřebovat zbytek po celočíselném dělení (tzv. modulo). U našeho příkladu 5 / 2 je celočíselný výsledek 2 a modulo 1 (zbytek). Modulo se často používá pro zjištění zda je číslo sudé (zbytek po dělení 2 je 0), když chcete např. vybarvit šachovnici, zjistit odchylku vaší pozice od nějaké čtvercové sítě a podobně.

V Javě a obecně v céčkových jazycích zapíšeme modulo jako %:

System.out.println(5 % 2); // Vypíše 1

Tak to bychom měli. V kurzu Základní konstrukce jazyka Java naleznete ještě několik dalších příkladů k procvičení, které určitě doporučujeme vypracovat. Na kurz nyní navazují Základy objektově orientovaného programování v Javě. Příště si tedy představíme objektový svět a pochopíme mnoho věcí, které nám až doteď byly utajovány :)

V následujícím kvízu, Kvíz - Pokročilé podmínky a cykly v Javě, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 989x (2.82 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Cykly v Javě potřetí - do-while, break a continue
Všechny články v sekci
Základní konstrukce jazyka Java
Přeskočit článek
(nedoporučujeme)
Kvíz - Pokročilé podmínky a cykly v Javě
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
559 hlasů
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 se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity