23.08.2013, Vladimír Klaus, navštíveno 5903x
Jsou věci, které mě (jako dlouholetého Delphistu) zaskočí. Jednou z těchto věcí je dělení čísel. Vypadá to zcela prostě, ale dělení v ASP.NET vám klidně vrátí celé číslo, i když je zřejmé, že podíl musí mít řadu desetinných míst.
Nedávno jsem potřeboval uvádět velikost souborů v MB. Řeknete si, že to je velmi jednoduché – údaje vydělíme milionem. Takže něco takového:
double VelikostMB = Velikost / 1000000;
Jenomže z principu věci mi tento výpočet zcela nesmyslně vracel pouze celé číslo. Po chvíli pátrání jsem došel k závěru, že je to bohužel správné. Pokud je dělenec a dělitel celé číslo, pak je výsledkem také celé číslo. Pokud je alespoň jedno z nich číslo desetinné, pak je i výsledek desetinné číslo.
Co se s tím dá dělat? Je zde naštěstí několik možností. První z nich je, že dělence nebo dělitele přetypujeme na desetinné číslo.
double VelikostMB = Velikost / (float)1000000;
Druhé řešení je v podstatě totéž, ale dá se využít, pokud dělíte přímo konkrétním číslem. Doplníte ho o desetinné místo s nulou a je to.
double VelikostMB = Velikost / 1000000.0;
A když jsem už překonal záhadu s dělením, bylo třeba zobrazit výsledné číslo na dvě desetinná místa a doplnit text MB. To už nebylo tak složité a výsledný kód vypadá takto. Díky znakům # bude zobrazena desetinná část, jen když tam nějaká bude (bude různá od nuly).
String.Format("{0:0.##} MB", VelikostMB)
Pokud ale chcete zobrazit i třeba údaj 15,00 MB, pak použijte tento formátovací řetězec.
String.Format("{0:0.00} MB", VelikostMB)
Pěkný článek o formátování desetinných čísel s celou řadou příkladů najdete zde:
http://www.csharp-examples.net/string-format-double/
Zbývá už jen dodat, že čísla typu float disponují rozsahem 10-45 až 1038 a s přesností na 7 desetinných míst, takže pokud potřebujete větší rozsah nebo vyšší přesnost, použijte raději typ double, který má rozsah od 10-324 do 10308 a přesnost na 16 desetinných míst. Více informací i pro další typy ukazuje tento obrázek:
Kontrolní otázka: Jaký bude výsledek výpočtu, který kombinuje typy, tak jak to mám v uvedeném příkladě, ale za předpokladu, že mě zajímá podíl 1/3?
double tretina = 1/(float)3;
Bude to 0,3333333 nebo 0,333333333333333 a proč? A co když double a float prohodím?