Jak zaokrouhlovat čísla v Pythonu [With Examples]

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 je None), který určuje, na kolik desetinných míst se má číslo zaokrouhlit. Pokud je ndigits = 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 a decimal. Pokud potřebujete vysoce přesnou aritmetiku s plovoucí desetinnou čárkou, zvolte decimal.
  • 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() a floor() z modulu math.
  • 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!