Práce s numerickými datovými typy v Pythonu: Zaokrouhlování čísel
Pracujete s numerickými daty v Pythonu a chcete dosáhnout mistrovství? Pak je tento článek pro vás. Naučíme se různé techniky zaokrouhlování čísel, které vám umožní pracovat s daty efektivněji.
V reálných datových souborech se běžně setkáváme s numerickými i kategorickými hodnotami. Numerické hodnoty se objevují v různých formách, od dat ze senzorů, přes směnné kurzy až po biomedicínské signály.
Při práci s číselnými daty se často vyskytne potřeba zaokrouhlit hodnoty na určitou přesnost. Důvody mohou být různé:
- Zajištění jednotného formátu dat
- Zjednodušení ukládání a zpracování
V tomto návodu prozkoumáme různé způsoby zaokrouhlování čísel v Pythonu. Podíváme se na zaokrouhlování na určitý počet desetinných míst, zaokrouhlování nahoru a dolů na nejbližší celé číslo a další užitečné techniky.
Pojďme na to!
Zaokrouhlování čísel pomocí vestavěné funkce round()
Nejběžnějším způsobem zaokrouhlování čísel v Pythonu je použití vestavěné funkce round()
. Podívejme se na její syntaxi:
round(num, ndigits)
Kde:
num
je číslo, které chceme zaokrouhlit.ndigits
je volitelný parametr (výchozí hodnota jeNone
), který určuje, na kolik desetinných míst se má číslo zaokrouhlit. Pokud jendigits = 2
, číslo se zaokrouhlí na dvě desetinná místa.- Funkce
round()
vrací číslo zaokrouhlené na zadaný počet desetinných míst.
Příklady použití funkce round()
Pro lepší pochopení si ukážeme několik příkladů:
Pokud zavoláme round()
pouze s číslem, bez specifikace počtu desetinných míst, číslo se zaokrouhlí na nejbližší celé číslo.
number = 7.123456 rounded = round(number) print(rounded) # Výstup: 7
Nyní si ukážeme příklady se specifikovanou přesností.
Pokud nastavíme ndigits
na 2, číslo se zaokrouhlí na dvě desetinná místa:
number = 7.123456 rounded = round(number, 2) print(rounded) # Výstup: 7.12
Nastavením ndigits
na 3 získáme číslo zaokrouhlené na tři desetinná místa:
number = 7.123456 rounded = round(number, 3) print(rounded) # Výstup: 7.123
Funkci round()
můžeme použít i pro zaokrouhlování záporných čísel:
number = -3.4 rounded = round(number) print(rounded) # Výstup: -3
V tomto případě je -3.4 zaokrouhleno na nejbližší celé číslo -3.
Zaokrouhlování na desítky a stovky
Věděli jste, že parametr ndigits
může nabývat i záporných hodnot?
Pokud použijeme záporné ndigits
, zaokrouhlujeme směrem doleva od desetinné čárky.
Podívejme se na příklady:
Pokud nastavíme ndigits
na -1, číslo se zaokrouhlí na nejbližší desítku:
number = 7.123456 rounded = round(number, -1) print(rounded) # Výstup: 10.0
Pokud zavoláme round()
s ndigits
nastaveným na -2, číslo 77.123456 se zaokrouhlí na nejbližší stovku, což je v tomto případě 100.0.
number = 77.123456 rounded = round(number, -2) print(rounded) # Výstup: 100.0
Zdá se, že funkce round()
se drží standardních principů zaokrouhlování, ale není tomu tak vždy. Kvůli omezením reprezentace čísel s plovoucí desetinnou čárkou, můžeme někdy dostat neočekávané výsledky. Další zajímavostí je „bankéřské zaokrouhlování“.
Co je bankéřské zaokrouhlování?
Zkuste si spustit Python REPL a vyzkoušejte následující:
>>> round(1.5) 2
round(1.5)
vrátí 2, což je očekávatelné. A co round(2.5)
?
>>> round(2.5) 2
Zajímavé, že? round(1.5)
i round(2.5)
vrátí 2. Jak je to možné?
Funkce round()
interně používá tzv. „bankéřské zaokrouhlování“ (nebo „round half to even“). Hodnoty, které jsou přesně uprostřed mezi dvěma celými čísly, se zaokrouhlí na nejbližší sudé celé číslo. Zde najdete více informací.
Funkce round()
je dostatečná pro jednoduché zaokrouhlování, ale někdy je potřeba zaokrouhlit číslo nahoru nebo dolů. V následujících kapitolách si ukážeme, jak na to.
Jak zaokrouhlit čísla v Pythonu nahoru
Pro zaokrouhlení čísla nahoru na nejbližší celé číslo můžeme použít:
Použití math.ceil
Funkce ceil()
zaokrouhlí číslo nahoru na nejmenší celé číslo, které je větší nebo rovno danému číslu.
import math number = 3.2 rounded_up = math.ceil(number) print(rounded_up) # Výstup: 4
Použití modulu decimal
Zatím jsme pracovali s datovým typem float, ale v některých aplikacích, například ve vědeckých a finančních výpočtech, potřebujeme vyšší přesnost. K tomu slouží modul decimal
, který poskytuje:
- Přesnější aritmetiku s plovoucí desetinnou čárkou.
- Spolehlivé testování rovnosti.
- Jemnější kontrolu nad úrovní přesnosti (výchozí je 28 desetinných míst).
Aktuální kontext můžeme zobrazit pomocí getcontext()
:
from decimal import getcontext current_context = getcontext() print(current_context)
Uvidíme informace o aktuálním režimu přesnosti a zaokrouhlování:
# Výstup Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
Pro zaokrouhlení čísla nahoru použijeme quantize()
s parametry:
- Přesnost (
0.0
, protože chceme zaokrouhlit na nejbližší celé číslo) - Režim zaokrouhlení:
ROUND_CEILING
.
from decimal import Decimal, ROUND_CEILING number = Decimal('3.2') rounded_up = number.quantize(Decimal('0'), rounding=ROUND_CEILING) print(rounded_up) # Výstup: 4
Číslo 3.2 bylo zaokrouhleno nahoru na nejbližší celé číslo 4.
Jak zaokrouhlit čísla dolů v Pythonu
Podívejme se, jak zaokrouhlit čísla dolů. Opět můžeme použít modul math
nebo decimal
.
Použití math.floor
Funkce floor()
z modulu math
zaokrouhlí číslo dolů na největší celé číslo, které je menší nebo rovno danému číslu.
Podívejme se na příklad:
import math number = 3.8 rounded_down = math.floor(number) print(rounded_down) # Výstup: 3
Funkce floor()
zaokrouhlila 3.8 dolů na 3.
Použití modulu decimal
Pro zaokrouhlení čísla dolů můžeme použít quantize()
s režimem zaokrouhlení nastaveným na ROUND_FLOOR
.
from decimal import Decimal, ROUND_FLOOR number = Decimal('3.8') rounded_down = number.quantize(Decimal('0'), rounding=ROUND_FLOOR) print(rounded_down) # Výstup: 3
Jak vidíme, 3.8 bylo zaokrouhleno dolů na 3.
Běžné nástrahy, kterým je třeba se vyhnout při zaokrouhlování čísel
Už víme, že round()
používá bankéřské zaokrouhlování. Další běžné nástrahy při zaokrouhlování čísel v Pythonu:
- Chybné porovnávání rovnosti: Zaokrouhlování často vede k chybám. Porovnávání zaokrouhleného výsledku s jinou hodnotou kvůli různým přesnostem většinou selže. Vyhýbejte se přímému porovnávání rovnosti mezi čísly s plovoucí desetinnou čárkou a zaokrouhlenými čísly. Pokud je porovnání nezbytné, použijte toleranci.
- Ztráta informací: Pokud zaokrouhlíte data zachycená s vysokou přesností, ztratíte informace. Například zaokrouhlením dat ze senzorů na méně desetinných míst můžete dosáhnout nesprávné analýzy.
- Zaokrouhlování mezivýsledků: Pokud provádíte výpočty s více kroky, používejte ve všech krocích konzistentní přesnost. Vyhýbejte se zaokrouhlování mezivýsledků, aby se chyby zaokrouhlování neskládaly.
Osvědčené postupy pro zaokrouhlování čísel v Pythonu
Zde je několik doporučení, které je dobré dodržovat při zaokrouhlování čísel v Pythonu:
- Vyberte správný datový typ: V závislosti na aplikaci se rozhodněte mezi
float
adecimal
. Pokud potřebujete vysoce přesnou aritmetiku s plovoucí desetinnou čárkou, zvoltedecimal
. - Používejte konzistentní přesnost: Pro desetinná čísla v celém programu nastavte konzistentní úrovně přesnosti. Vyhnete se tak neočekávaným chybám.
- Dokumentujte techniky zaokrouhlování: U reálných aplikací je důležité mít konzistentní a zdokumentovanou techniku zaokrouhlování (například pro měny a data ze senzorů).
Závěrem
Rychlý přehled toho, co jsme se naučili:
- K zaokrouhlení čísel můžeme použít vestavěnou funkci
round(num, ndigits)
. Měli bychom si však být vědomi bankéřského zaokrouhlování, kdy se čísla přesně uprostřed zaokrouhlí na nejbližší sudé celé číslo. - Pro zaokrouhlení nahoru a dolů na nejbližší celé číslo můžeme použít funkce
ceil()
afloor()
z modulumath
. - Modul
decimal
nám umožňuje provádět vysoce přesnou aritmetiku s plovoucí desetinnou čárkou. Čísla můžeme zaokrouhlovat s požadovanou přesností a strategii zaokrouhlování. - Měli bychom být si vědomi možných nástrah při zaokrouhlování čísel v Pythonu, jako je ztráta informací, zaokrouhlování mezivýsledků a nekonzistentní přesnost.
- Mezi osvědčené postupy patří volba správného datového typu a dokumentace technik zaokrouhlování.
Nyní se můžete naučit, jak provést celočíselné dělení v Pythonu.
Byl pro vás tento článek užitečný?
Děkujeme za zpětnou vazbu!