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.

Ostatnia modyfikacja: poniedziałek, 24 października 2022, 02:19