Jaka jest kwota podatku (23%) od towaru z ceną 12,32 złotego? Wynik działania 23*12,32 / 100 wynosi 2,8336. Jednak mówimy o walucie: złotówkach które dzielą się na grosze i nic ponad to. Mamy więc do zapłaty 2,83 złotego. Jeśli liczymy pieniądze, dobrze byłoby dysponować systemem obliczeń, uwzględniającym przyjęte zasady zaokrągleń. Taki system zdefiniowała firma IBM: Decimal Arithmetic Specification. System ten zaimplementowano w języku Python, w bibliotece decimal.
from decimal import Decimal
import decimal
kontekst = decimal.getcontext()
kontekst.prec = 3 # precyzja obliczeń (ilość cyfr)
kontekst.rounding=decimal.ROUND_HALF_DOWN # sposób zaokrąglania
cena = Decimal('36.59')
vat = Decimal('0.23')
podatek = cena*vat
print('Wynik: %s' % podatek)
Wynik: 8.42
Arytmetyka dziesiętna może rodzić pewne problemy, dlatego należy stosować ją z rozwagą. Pierwszym problemem jest wolniejsze wykonywanie działań na tak zapisanych liczbach. Jeśli są to masowe obliczenie – lepiej pamiętać liczby jako zmiennoprzecinkowe (float).
W bibliotece decimal zaimplementowano także kontekst umożliwiający określenie precyzji obliczeń (ilości znaczących cyfr w wyniku):
Uwaga! Wbrew intuicyjnym oczekiwaniom własność getcontext().prec nie dotyczy ilości miejsc po przecinku, ale ilości cyfr ogółem. Jest to mało wygodne rozwiązanie. Dlatego do zaokrągleń lepiej stosować metodę quantize:
from decimal import Decimal import decimal DECIMAL=Decimal('.01') cena = Decimal('36.59') vat = Decimal('0.23') podatek=(cena*vat).quantize(DECIMAL) print('Wynik: %s' % podatek)
Wynik: 8.42
Począwszy od wersji 3.3 Pythona funkcja round działa na liczbach dziesiętnych i to ją można stosować do zaokrągleń.
Z zaokrągleniami wiąże się pewien problem, który ma duże znaczenie praktyczne, które obrazuje poniższe wyliczenie:
brutto |
netto (=brutto/1,23) |
podatek (brutto-netto) |
netto*0.23 |
45 |
36,59 |
8,41 |
8,42 |
Jeśli mamy podane okrągłe ceny brutto, to wyliczony podatek nie będzie identyczny, jak ten wyliczony od ceny netto. Jeśli nabywca prowadzi ewidencję w cenach netto – będzie miał problem z rozliczeniem jednego grosza.