Seriál Ruby on Rails 6: Datové typy: BigNum, FixNum, Float
Práce s číselnými datovými typy. Celá čísla v podobě FixNum a BigNum a desetinná čísla typu Float.
BigNum, FixNum
První dva datové typy, na které se podrobněji podíváme, jsou typy určující celé číslo. Oba tyto datové typy jsou si podobné, rozdíl spočívá pouze v možnosti uchovávat různé velikosti čísel.
Datový typ FixNum slouží pro uchování malých čísel, kdežto BigNum můžeme použít pro uchování velkých čísel. O typování se nám stará sám interpret, takže jestli je číslo uloženo jako BigNum nebo FixNum my jako programátor řešit nemusíme. Interpret jazyka automaticky vybere vhodný datový typ celého čísla, pokud je číslo příliš velké, automaticky jej uloží jako BigNum.
Výhoda, že jsou pro celá čísla použity dva datové typy, spočívá především v datové náročnosti. Čísla uložená jako FixNum zabírají v paměti méně místa.
Pro usnadnění zápisu velkých celých čísel nám Ruby umožňuje jednu zajímavou věc. V definici celého čísla můžeme používat znak podtržítka pro oddělení řádů, nebo jenom tak, pro lepší orientaci v čísle. Tento znak je při překladu vypuštěn:
1 |
puts 1_000_000_000 #vypise 1000000000 |
Pro práci s těmito dvěma datovými typy existují stejné možnosti a stejné funkce, některé základní funkce si můžeme uvést.
Funkce abs – fix.abs
Funkce se vztahuje k danému číslu a vrací jeho absolutní hodnotu, vše bude jistě patrné na příkladu:
1 2 |
puts -132.abs #vypise 132 puts 132.abs #vypise 132 |
Funkce size – fix.size
Funkce vrací počet bytů, které zabírá dané číslo v paměti počítače. Použití je opět velmi jednoduché:
1 2 |
puts 1.size #vypise 4 puts 1000000000000000000000.size #vypise 12 |
Funkce zero? – fix.zero?
Určuje, zda daný výraz má nulovou hodnotu. K této funkci existuje i několik aliasů v jiných datových typech, ovšem pro celá čísla můžeme použít právě zero?:
1 2 3 |
puts 1.zero? #vypise false puts 0.zero? #vypise true puts -2.zero? #vypise false |
Funkcí pro práci s celými čísly samozřejmě existuje více. Všechny jsou uvedeny v dokumentaci jazyka. Krom funkcí můžeme pro práci s celými čísly používat samozřejmě matematické operátory.
Float
Předchozí dva datové typy měly definovanou množinu pouze v celých číslech, abychom mohli s čísly pracovat důkladněji, potřebujeme datový typ pro práci s plovoucí desetinnou čárkou a právě to nám dovoluje datový typ Float.
Pro práci s tímto datovým typem můžeme použít stejné funkce, které nám umožňují datové typy FixNum a BigNum, plus některé funkce, které využijeme pouze při práci s desetinnými čísly.
Desetinná část se v Ruby odděluje od celé části znakem tečka, nikoli čárka, jak jste tomu možná navyklí.
Zaokrouhlování – round, ceil, floor
Velmi častou operací s desetinnými čísly je operace zaokrouhlování. V ruby máme kromě klasického zaokrouhlování možností opět více.
Nejprve se podívejme na klasické zaokrouhlení, jak jej známe z matematiky. Číslo je zaokrouhlováno směrem dolů nebo nahoru, podle zbytku po odečtení celé části od absolutní hodnoty této celé části. K tomuto účelu, pro logické zaokrouhlování, využijete funkce round:
1 2 3 |
puts 1.1.round #zaokrouhli smerem dolu a vypise 1 puts 1.5.round #zaokrouhli smerem nahoru a vypise 2 puts 1.9.round #zaokrouhli smerem nahoru a vypise 2 |
Krom tohoto logického zaokrouhlování můžeme rozhodnou o zaokrouhlení čísla sami a zaokrouhlovat defaultně buď směrem dolů, nebo směrem nahoru. K tomuto účelu nám slouží funkce ceil (zaokrouhlí směrem nahoru) a floor (zaokrouhlí směrem dolů):
1 2 3 4 |
puts 1.1.ceil #zaokrouhli smerem nahoru, vypise 2 puts 0.001.ceil #zaokrouhli smerem nahoru, vypise 1 puts 1.1.floor #zaokrouhli smerem dolu, vypise 1 puts 0.001.floor #zaokrouhli smerem dolu, vypise 1 |
Zajímavé je, že pokud použijeme některou z těchto funkcí, není výsledkem typ Float ale typ FixNum, nebo BigNum. Ruby automaticky výsledek přetypuje, protože výsledek typu Float není nutný a FixNum nebo BigNum je dostatečně přesný pro výsledek operace.
Závěrem
Práce s číselnými typy je vcelku jednoduchá, příště se podíváme na práci s řetězci, které v sobě skrývají více možností.
Jen upozornim, ze v poslednim prikladu:
puts 0.001.floor #zaokrouhli smerem dolu, vypise 1
se vypise 0, nikoliv 1.