Pevná řádová čárka je způsob jak v paměti reprezentovat reálné číslo. To je v paměti uloženo jako celé číslo (int) ale při jeho reprezentaci se uvažuje, že je někde pomyslná desetinná čárka.
Proč bych něco takového chtěl? V Céčku přece můžu použít flat
a nemusím se dál o nic starat… Nebo je to jinak?
Použití datového tipu float
není vždy možné nebo vás stojí příliš mnoho
paměti. Obzvlášť pokud programujete mikrokontrolery nemůžete s paměti
příliš plýtvat. A pokud byste chtěli použít %f
v funkci printf
zjistíte, že váš program má najednou o 20kB víc. Tohle si nemůžete často dovolit.
Například číslo \(31.4160\) je v paměti uloženo jako celé číslo \(314160\). Programátor ale ví, že číslo má dvě celá místa a čtyři desetinná místa. S číslem se pracuje jakoby šlo o celé číslo. Jen je třeba dát si pozor, aby se nám při výpočtech a matematických operacích desetinná čárka nepatřičně neposunula. Nejlépe je ukázat si vše na malém příkladu, kde bude vše snad pochopitelné.
Dejme tomu, že chci vydělit čísla 54321 a 1024.
Dejme tomu, že chci pracovat s přesností na 2 desetinná místa.
Použijeme pevnou řádová čárku, takže čitatele vynásobíme číslem 100. Pozor, pracujeme s celým číslem, takže i dělení je celočíselné – bezezbytku. To znamená, že se nám výsledek zaokrouhlí vždy dolů.
Aby byl výsledek správně zaokrouhlen použijeme malý fígl a k čitateli připočteme ještě polovinu jmenovatele:
Jak funguje tento fígl? No …
To znamená, že k výsledku ještě před useknutím desetinné části (k tomu dochází při celočíselném dělení) připočteme \(0.5\). Tak dojde ke zaokrouhlení.
Teď už je výsledek správně a stačí jej pouze správně interpretovat. Nejprve vytiskneme celou část – tedy výsledek podělený číslem 100 a poté desetinnou část – ta je dána zbytkem po dělení číslem 100.
int result = 5305;
printf("%d.%02d", result / 100, result % 100 );
Pozor desetinnou část je třeba tisknout jako "%02d"
: to znamená a dvě místa
včetně nul na začátku.
Pokud bychom použili "%d"
vytisklo by se 53.5
.
Pokud bychom použili "%2d"
vytisklo by se 53. 5
.
Až při použili "%02d"
se výsledek tiskne jako 53.05
.