Rozdział 4 · Python lubi liczby

Decimal – gdy potrzebujesz dokładnej arytmetyki dziesiętnej

W przypadku pieniędzy i księgowości nawet najmniejszy błąd może float być nie do przyjęcia – przyjrzyjmy się narzędziu, które go usuwa.

Już to widzieliśmy float przechowuje przybliżenie (Rozdział 4.11). W większości zadań nie stanowi to problemu – ale przy pieniądzach nawet minimalny margines błędu kumuluje się i może stać się zauważalna. W tym celu biblioteka standardowa ma decimal.

decimal_demo.py
from decimal import Decimal

print(Decimal("0.1") + Decimal("0.2"))  #0.3 – Dokładność, brak marginesu błędu

Stwórz Decimal z łańcuch znaków nie float

To chyba najważniejszy praktyczny szczegół w całej sekcji:

stroka_vs_float.py
from decimal import Decimal

print(Decimal("19.99"))  #Decimal('19.99') to dokładnie to, co napisałeś
print(Decimal(19.99))    # Decimal('19.9900000000000000000000000000000000000000131628...') — odziedziczył błąd float!
Dlaczego tak się dzieje?
Decimal(19.99) najpierw tworzy zwykły float 19.99 — już z tym samym przybliżeniem z sekcji 4.11 — a następnie opakuje tę przybliżoną wartość w Decimal. Dokładność jest już utracona w tym momencie. Decimal("19.99") czyta tekst bezpośrednio i w ogóle nie przechodzi przez float — dlatego zachowuje dokładnie wartość, którą wpisałeś.

Przykład: zakup

pokupka.py
from decimal import Decimal

price = Decimal("19.99")
quantity = 3
total = price * quantity
print(total)  # 59.97 — dokładnie

Decimal nie jest „zawsze lepsze”

floatDecimal
SpeedSzybki — sprzętowe wsparcieSwolniejszy – Implementacja programowa
Typowe zastosowanieObliczenia naukowe, pomiary, ogólne zastosowaniaPieniądze, księgowość, gdzie ważna jest dokładność dziesiętna
DokładnośćPrzybliżenie binarneDokładny zapis dziesiętny
Nie wymieniaj każdego float na Decimal
Decimal jest właściwym wyborem dla pieniędzy i księgowości, gdzie precyzja dziesiętna i przewidywalne zaokrąglanie są ważne. W większości obliczeń naukowych i codziennych stosuje się standardowe float szybsze i absolutnie wystarczające.
Praktyka: Decimal i pieniądze
Interaktywny laptop bezpośrednio w przeglądarce – Decimal(str) vs Decimal(float)
Otwórz praktykę →