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”
| float | Decimal | |
|---|---|---|
| Speed | Szybki — sprzętowe wsparcie | Swolniejszy – Implementacja programowa |
| Typowe zastosowanie | Obliczenia naukowe, pomiary, ogólne zastosowania | Pieniądze, księgowość, gdzie ważna jest dokładność dziesiętna |
| Dokładność | Przybliżenie binarne | Dokł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)