V programovacím jazyce Python se často setkáváme s datovým typem `float`. Tento typ slouží k reprezentaci čísel s plovoucí desetinnou čárkou. Jde o čísla, která mohou být jak kladná, tak záporná, a mají desetinnou část. Do této kategorie spadají i čísla zapsaná ve vědeckém formátu, kde se k označení mocniny deseti používá symbol „e“ nebo „E“.
Datový typ `float` má klíčový význam, protože umožňuje reprezentovat širokou škálu reálných čísel, a to jak velmi malých, tak i velmi velkých.
Níže uvádíme několik příkladů čísel s plovoucí desetinnou čárkou, jak je definujeme v Pythonu:
# příklady čísel typu float a = 20.0 b = -51.51345 c = 65e7 d = -1.08E12 e = 2E10 print(type(a)) print(type(b)) print(type(c)) print(type(d)) print(type(e))
Výstup z uvedeného kódu bude:
<class 'float'> <class 'float'> <class 'float'> <class 'float'> <class 'float'>

Čísla s plovoucí desetinnou čárkou poskytují přesnější výpočty ve srovnání s celými čísly. Zatímco celá čísla by například číslo 3,142 zkrátila na 3, datový typ `float` uchová číslo s desetinnou částí, tedy 3,142. Proto je `float` vhodnější pro matematické operace, které vyžadují vysokou přesnost.
Díky své přesnosti se `float` hojně využívá v oblastech jako modelování reálného světa, strojové učení, datová věda, finanční a ekonomické analýzy, matematické výpočty, grafika, vizualizace a vědecko-technické aplikace.
Celá čísla vs. Čísla s plovoucí desetinnou čárkou v Pythonu
Kromě `float` jsou v Pythonu velmi populární celá čísla, reprezentovaná datovým typem `int`. Na rozdíl od čísel s plovoucí desetinnou čárkou, celá čísla nemají desetinnou část. Zahrnují kladná celá čísla, záporná celá čísla a nulu.
Celá čísla jsou ideální pro operace, které pracují s celými hodnotami, jako je počítání nebo indexování.
Příklady celých čísel v Pythonu jsou:
a = 0 b = 968 c = -14 print(type(a)) print(type(b)) print(type(c))
Výstup:
<class 'int'> <class 'int'> <class 'int'>

Hlavní rozdíly mezi celými čísly a čísly s plovoucí desetinnou čárkou v Pythonu:
| Charakteristika | Celá čísla (int) |
Čísla s plovoucí desetinnou čárkou (float) |
| Reprezentace | Celá čísla, jejich záporné protějšky a nula, bez desetinné části. | Reálná čísla s desetinnou částí. |
| Přesnost | Neomezená přesnost, omezená pouze dostupnou pamětí. | Omezená přesnost, maximální hodnota přibližně 1.8 x 10308. |
| Využití paměti | Obvykle méně paměti. | Větší nároky na paměť než u celých čísel. |
| Bitové operace | Běžně využívané v bitových operacích. | Prakticky se nepoužívají. |
| Typické použití | Počítání, indexování, bitové operace. | Měření, vědecké výpočty, většina matematických operací. |
Různé způsoby vytváření a použití čísel s plovoucí desetinnou čárkou v Pythonu
Nejjednodušší způsob, jak začít pracovat s typem `float` v Pythonu, je přiřadit proměnné hodnotu typu `float`:
# přiřazení hodnoty float proměnné a = 3.142
Další možností je převést celá čísla nebo číselné řetězce na typ `float` pomocí konstruktoru `float()`. Tento konstruktor převede celočíselnou hodnotu i číselný řetězec na číselnou hodnotu s plovoucí desetinnou čárkou:
number1 = 2524 numString1 = "513.523" numString2 = "1341" # Konverze na float a uložení do proměnné a = float(number1) print(a) b = float(numString1) print(b) c = float(numString2) print(c)
Výstup:
2524.0 513.523 1341.0

V příkladu výše se celé číslo a číselné řetězce převedly na typ `float` a uložily do proměnných, které následně vytiskneme. Výsledkem je hodnota s plovoucí desetinnou čárkou.
Dalším způsobem, jak získat `float`, je pomocí matematických výpočtů, například dělením:
num1 = 20
num2 = 3
result = num1/num2
print("Výsledek dělení jako celé číslo:")
print(int(20/3))
print("Výsledek dělení jako float:")
print(result)
print(type(result))
Výstup:
Výsledek dělení jako celé číslo: 6 Výsledek dělení jako float: 6.666666666666667 <class 'float'>

Zde vidíme, že typ `float` nám poskytuje přesnější výsledek dělení než použití celočíselného dělení.
Při práci s čísly s plovoucí desetinnou čárkou můžeme narazit na zajímavé výsledky způsobené tím, jak jsou tyto hodnoty interně uloženy v počítači. Čísla s plovoucí desetinnou čárkou jsou totiž uložena jako binární zlomky se základem 2. Většina desetinných zlomků nelze přesně reprezentovat jako binární zlomek, zvláště pokud jde o opakující se desetinná místa. Proto se `float` obvykle ukládají jako aproximace skutečné hodnoty.
Jako příklad si můžeme vzít hodnotu 0,3. Interně se 0,3 neuloží jako přesná hodnota 0,3. Chceme-li se přesvědčit, můžeme použít funkci `format()`, která nám umožní zobrazit libovolný počet platných číslic dané hodnoty. V následujícím příkladu zobrazíme 0,3 až na 20 desetinných míst:
num = 0.3
print("num na 20 desetinných míst")
print(format(num, '.20f'))
print("Hodnota, kterou jsme uložili do num")
print(num)
Výstup:
num na 20 desetinných míst 0.29999999999999998890 Hodnota, kterou jsme uložili do num 0.3

Je zřejmé, že hodnota 0,3 není v paměti uložena přesně. Při tisku proměnné dostáváme zaokrouhlenou hodnotu.
Tato skutečnost může vést k neočekávaným výsledkům při výpočtech. Například 0,3 + 0,3 + 0,3 by mělo být 0,9. Nicméně, jak ukazuje Python, tomu tak není, protože interně ukládá binární aproximace skutečné hodnoty:
sum = 0.3 + 0.3 + 0.3
answer = 0.9
print("Je součet roven výsledku: ")
print(sum == answer)
print("Interní reprezentace součtu je: ")
print(sum)
print("Výsledek z manuálního výpočtu je: ")
print(answer)
Výstup:
Je součet roven výsledku: False Interní reprezentace součtu je: 0.8999999999999999 Výsledek z manuálního výpočtu je: 0.9

Je tedy důležité mít na paměti, že Python neukládá přesné hodnoty čísel s plovoucí desetinnou čárkou, ale jejich aproximace. Při porovnávání hodnot `float` je vhodné zaokrouhlit je na stejný počet platných číslic. Pokud potřebujete vyšší přesnost, je doporučeno použít vestavěný modul `decimal`.
Desítkový modul v Pythonu
V situacích, kdy je vyžadována vysoká přesnost, zejména ve finančních nebo vědeckých výpočtech, není datový typ `float` nejlepším řešením. Pro přesnou práci s čísly s plovoucí desetinnou čárkou použijeme modul `decimal`.
Na rozdíl od `float`, který se ukládá jako binární reprezentace závislá na stroji, modul `decimal` ukládá čísla s plovoucí desetinnou čárkou v desítkové reprezentaci, která je na stroji nezávislá, čímž dosahuje vyšší přesnosti.
Desítkový modul je schopný reprezentovat desetinná čísla přesně tak, jak je zadáváme, a používat je v této podobě při výpočtech. Také nabízí správně zaokrouhlenou aritmetiku s plovoucí desetinnou čárkou.
Chcete-li začít používat desítkový modul, je potřeba jej importovat:
import decimal
Pro srovnání si ukážeme, jak by vypadal dřívější příklad s porovnáním součtu 0,3 + 0,3 + 0,3 s hodnotou 0,9, za použití modulu `decimal`:
import decimal
sum = decimal.Decimal('0.3') + decimal.Decimal('0.3') + decimal.Decimal('0.3')
answer = decimal.Decimal('0.9')
print("Je součet roven výsledku: ")
print(sum == answer)
print("Interní reprezentace součtu je: ")
print(sum)
print("Výsledek z manuálního výpočtu je: ")
print(answer)
Výstup:
Je součet roven výsledku: True Interní reprezentace součtu je: 0.9 Výsledek z manuálního výpočtu je: 0.9

Jak vidíme, pro situace vyžadující vysokou přesnost je použití modulu `decimal` nezbytné.
Běžné chyby při práci s čísly s plovoucí desetinnou čárkou
Mnohé chyby při práci s typem `float` pramení z nepochopení, jak jsou čísla s plovoucí desetinnou čárkou interně reprezentována v Pythonu. Vzhledem k tomu, že Python neukládá hodnoty přesně, ale jako aproximace, můžete se setkat s chybami, pokud očekáváte, že hodnoty budou uloženy tak, jak byly zadány.

Jednou z častých chyb je chyba zaokrouhlování při provádění matematických výpočtů. Kvůli tomu, že Python neukládá přesné hodnoty, mohou být výsledky výpočtů odlišné od očekávaných.
Vzhledem k těmto chybám se můžete setkat s problémy při porovnávání rovnosti mezi hodnotami s plovoucí desetinnou čárkou. Proto je důležité při práci s `float` být obezřetný a brát v úvahu, že se mohou objevit neočekávané výsledky.
Nejlepším způsobem, jak se vyhnout chybám při práci s `float`, je použití desítkového modulu. Získáte tak předvídatelné a přesné výsledky při výpočtech s čísly s plovoucí desetinnou čárkou.
Závěr
Jako programátor v Pythonu se s datovým typem `float` setkáte velmi často. Abyste předešli chybám při práci s ním, je důležité pochopit, jak Python interně reprezentuje čísla s plovoucí desetinnou čárkou. Pamatujte, že Python neukládá přesné hodnoty `float`, proto se vyhněte přímému porovnávání rovnosti. V opačném případě mohou nastat chyby.
Pokud ve vaší aplikaci potřebujete přesné výsledky, nepoužívejte `float`, ale desítkový modul. Ten nabízí přesné výsledky výpočtů s čísly s plovoucí desetinnou čárkou a reprezentuje je přesně tak, jak jsou zadány, a to nezávisle na konkrétním počítači.
Dále si můžete přečíst o funkcích Python Itertools a konstrukci Python Try Except.