When Decimal is better than float (Python)

How it began?

This week I was dealing with something that required me to store data in AWS Dynamo and I found something interesting which lead me to write this piece of article.

Here is what happened?

I was trying to store float values to the AWS dynamo table but it didn't well it raised a Type Error that
inexact numeric for data I was trying to solve.

Understood why (0.1+0.2) != 0.3

After a bit of googling, I came to realize that python does not store exact floating numbers but with tons of decimal other decimal precision(this has to do with the design of the language itself)

Here an example

>>> 1.1 + 1.3
2.4000000000000004

what can we do now?

Python has got you covered, there is a built-in module called decimal which is built on top of float-point data types allowing you to have exactly decimal numbers

Here an example

>>> from decimal import Decimal
>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

As we can see 0.1 in python is nothing but 0.1 with tons of decimals, to express 0.1 as 0.1 we have to pass it as string
to our Decimal function just as shown below;

>>> from decimal import Decimal
>>> Decimal('0.1')
Decimal('0.1')
>>> Decimal('0.1') + Decimal('0.2') == Decimal('0.3')
True

As we can see now 0.1 is presented in exact values, and with this trick I was able to effectively store my float values in the AWS lambda smoothly.

Other areas to use Decimal instead of float ?

  1. Accounting Application

When you're dealing with accounting calculation which is probably going to involve calculation with decimal point use Decimal points instead of float values for more accurate and precision in your financial calculation

2. Converting Decimal to Fraction

When you're writing a program which in some ways do the conversion of decimal numbers to integer fraction, you don't wanna use float, it will screw you up;

Just to put it into action try converting a float value 0.35 to integer fraction

>>> (0.35).as_integer_ratio()
(3152519739159347, 9007199254740992)

Using decimal instead

>>> Decimal('0.35').as_integer_ratio()
(7, 20)

Well that's all I have got for today, you can keep in touch with me on Twitter kalebu for more tricks

Gotta any other places you think we should be using Decimal instead of float, Please share in the comment box below;

Kalebu Jordan
I am a Mechatronics engineer and professional Python Developer passionate about innovation, opensource and technical writing, Here I will be writing mostly on Python, DevOps, AI/ML and security
Dar es Salaam, Tanzania