Decimal
Native Python float values use your computer hardware directly, so any value is represented internally as a binary fraction.
That means that you usually work with approximations, not exact values:
In : format(0.1, '.17f')
Out: '0.10000000000000001'
The decimal
module lets you use decimal floating point arithmetic with arbitrary precision:
In : Decimal(1) / Decimal(3)
Out: Decimal('0.3333333333333333333333333333')
That's still can be not enough:
In : Decimal(1) / Decimal(3) * Decimal(3) == Decimal(1)
Out: False
For perfect computations, you can use fractions
, that stores any number as a rational one:
In : Fraction(1) / Fraction(3) * Fraction(3) == Fraction(1)
Out: True
The obvious limitation is you still have to use approximations to irrational numbers (such as π).