Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
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 13 - Matematické funkce v Javě a knihovna Math

V minulé lekci, Vícerozměrná pole v Javě, jsme se věnovali vícerozměrným polím.

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 odhlehčujícím článkem s přehledem matematických funkcí, které se nám v našich programech jistě budou v budoucnu hodit.

Základní matematické funkce jsou v Javě obsaženy v třídě Math. Třída nám poskytuje dvě základní konstanty: PI a E. 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

min(), max()

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

round(), ceil(), floor()

Všechny tři funkce 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 floor() vždy dolů.

Metodu round() budeme jistě potřebovat často, další funkce 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.

abs() a signum()

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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

sin(), cos(), 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.

acos(), asin(), atan()

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

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ř. 2^3, kód by byl následující:

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

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

exp(), log(), log10()

Metoda exp() vrací Eulerovo číslo, umocněné na daný exponent. 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. odm. z 8 = 8^(1/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 (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. 2 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ř. 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í navazuje kurz 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 příští lekci, Nejčastější chyby Java nováčků - Umíš pojmenovat proměnné?, si ukážeme nejčastější chyby začátečníků v Javě ohledně pojmenování proměnných.


 

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 796x (2.82 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Vícerozměrná pole v Javě
Všechny články v sekci
Základní konstrukce jazyka Java
Přeskočit článek
(nedoporučujeme)
Nejčastější chyby Java nováčků - Umíš pojmenovat proměnné?
Článek pro vás napsal David Čápka
Avatar
Uživatelské hodnocení:
87 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi 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

 

 

Komentáře
Zobrazit starší komentáře (18)

Avatar
Tano7
Člen
Avatar
Tano7:6.10.2019 21:54

Dobře pochopitelné a zpracované. Díky! Dělám si výtažky ze všech lekcí do .doc a .txt a když něco nevím, ctrl+F a vyhledám hned Off-line.
» Máte někdo prosím návod, jak program v Javě vytvořen v NetBeans zveřejnit na svých stránkách www?
Zkoušel jsem v NetBeansu F11 /Build Projekt/,ale jak zviditelnit na webhostingu, www.endora.cz/vlastnosti. Stránky mám zatím ve WordPressu. Free webhosting tam nepodporuje Java/JavaScrip­t/JPS. Zkoušel jsem nějaké Pluginy do WordPressu a nic. Apache TomCat server mám v PC nainstalovaný a i v NetBeansu aktivní všechny Pluginy. Program v NetBeansu v Java with Maven/Java Applikation. Děkuji za jakoukoliv radu. ;-)

Odpovědět
6.10.2019 21:54
Život by byl mnohem snazší, kdybychom k němu měli zdrojový kód.
Avatar

Člen
Avatar
:4.2.2020 13:16

Slušná práce, pěkně udělané.

 
Odpovědět
4.2.2020 13:16
Avatar
Aleš Fiala
Člen
Avatar
Aleš Fiala:3.5.2020 17:29

Neví někdo co dělám ve všech projektech na NetBeans 11.2 blbě? Po napsání kódu se mi to po spuštění nic ze System.out.prin­tln("Hello"); nevypíše a po Clean and Build se mi udělá Build failed, to se mi teď stává většinou. Co těm programům chybí? Dík za rady.

 
Odpovědět
3.5.2020 17:29
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Aleš Fiala
Lubor Pešek:14.3.2021 16:56

Zkus sem třeba navrkat přímo hlášku, kteoru ti to píše.
Osobně bych to tipoval na nekompatibilní javu, nebo špatně nastavenou, ale takto hádat se nedá.
Chce to zkontrolovat spoustu věcí - jaké verze máš nainstalované, jestli ji máš v netbeansech správně nastavené, atd.

Je fakt, že oracle po odkoupení javy od sunu tu javu kurví jak jen to jde. Hlavně to spoustu lidí odradilo.

Odpovědět
14.3.2021 16:56
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
ishei
Člen
Avatar
ishei:7.5.2021 21:29

Mensi nepresnost v clanku, ktera muze byt pri behu realneho programu zasadni: Math.round() nevraci double, ale long nebo int - podle toho, jestli zaokrouhlujeme double ci float.

 
Odpovědět
7.5.2021 21:29
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jaroslav Drobek:28. ledna 9:24

Znak \n v prvním kódu lekce nevidím.

Takže např. ceil(-1.7) je -1? Nebo vždy "dolů", tj. -2? Jinými slovy: představuje metoda ceil() tzv. "celou část reálného čísla"?

Převod z radiánů na stupně se realizuje vynásobením (ne vydělením) uvedeným výrazem, tj. * (180/Math.PI) ..

 
Odpovědět
28. ledna 9:24
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Jaroslav Drobek
Petr Štechmüller:28. ledna 10:42

Ahoj, znak \n nevidíš, protože ho tam sama přidá metoda println

Ceil jak bylo popsáno zaokrouhlí nahoru.

ceil(-1.7) = 1
ceil(1.2) = 2
Odpovědět
28. ledna 10:42
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Jaroslav Drobek:28. ledna 11:50

A to minus tam nebude? Tj.

ceil(-1.7) = -1
 
Odpovědět
28. ledna 11:50
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Jaroslav Drobek
Petr Štechmüller:28. ledna 11:54

Jo samozřejmě tam bude 😁
Někam mi uteklo

Odpovědět
28. ledna 11:54
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Atrament
Supertvůrce
Avatar
Odpovídá na Petr Štechmüller
Atrament:29. ledna 1:10

Já myslím že ta zmínka o \n tam zbyla z nějaké dřívější verze článku, kdy se tam nejspíš pro výstup používalo printf :)

 
Odpovědět
29. ledna 1:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 28. Zobrazit vše