How to perform accurate Decimal Calculations using Python?

Floating-point arithmetic in Python can introduce precision errors when performing decimal calculations. This article explores two methods to achieve accurate decimal calculations: using the decimal module and the math.fsum() function.

The Problem with Floating-Point Arithmetic

Standard floating-point numbers cannot accurately represent all decimal values due to IEEE 754 standard limitations. This leads to unexpected calculation errors ?

x = 4.2
y = 3.1

# printing the sum of both variables
print("x + y =", x + y)

# checking if the sum equals 7.3
print((x + y) == 7.3)
x + y = 7.300000000000001
False

These errors occur because Python's float data type uses the native binary representation, which cannot precisely store certain decimal values.

Method 1: Using the Decimal Module

The decimal module provides exact decimal arithmetic at the cost of some performance. It represents numbers as strings to avoid binary conversion errors ?

from decimal import Decimal

x = Decimal('4.2')
y = Decimal('3.1')

# printing the sum of both variables
print("x + y =", x + y)

# checking if the sum equals 7.3
print((x + y) == Decimal('7.3'))
x + y = 7.3
True

Controlling Precision with localcontext

The decimal module allows precise control over rounding and precision using localcontext ?

from decimal import Decimal, localcontext

x = Decimal('2.3')
y = Decimal('2.7')

# default precision
print("Default:", x / y)

# custom precision
with localcontext() as context:
    context.prec = 3
    print("Precision 3:", x / y)
    
    context.prec = 10
    print("Precision 10:", x / y)
Default: 0.8518518518518518518518518519
Precision 3: 0.852
Precision 10: 0.8518518519

Method 2: Using math.fsum()

The math.fsum() function provides accurate floating-point summation by avoiding precision loss from adding very large and very small numbers ?

The Problem with Regular sum()

values = [1.23e+18, 1, -1.23e+18]

# regular sum loses precision
print("Regular sum:", sum(values))
Regular sum: 0.0

Solution with fsum()

import math

values = [1.23e+18, 1, -1.23e+18]

# fsum preserves precision
print("Using fsum:", math.fsum(values))
Using fsum: 1.0

When to Use Each Method

Method Best For Performance Precision
decimal Financial calculations Slower Exact decimal
math.fsum() Scientific computing Faster Accurate summation
float General computing Fastest IEEE 754 precision

Conclusion

Use the decimal module for financial applications requiring exact decimal arithmetic. Use math.fsum() for accurate summation in scientific computing. Regular floats remain suitable for most general-purpose calculations where minor precision errors are acceptable.

Updated on: 2026-03-26T23:55:55+05:30

2K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements