
- Python Basic Tutorial
- Python - Home
- Python - Overview
- Python - Environment Setup
- Python - Basic Syntax
- Python - Comments
- Python - Variables
- Python - Data Types
- Python - Operators
- Python - Decision Making
- Python - Loops
- Python - Numbers
- Python - Strings
- Python - Lists
- Python - Tuples
- Python - Dictionary
- Python - Date & Time
- Python - Functions
- Python - Modules
- Python - Files I/O
- Python - Exceptions
How to perform accurate Decimal Calculations using Python?
In this article, we will learn how to perform Accurate Decimal Calculations in Python.
Methods Used
Using the Decimal() function of the decimal Module
Using the fsum() function of the math module
The inability of floating-point numbers to accurately represent all base-10 numbers is a well-known drawback. Furthermore, even straightforward mathematical computations have few errors. For instance −
Example
The following program shows the inability of floating-point integers to express all base-10 numbers accurately −
x = 4.2 y = 3.1 # printing the sum of both the variables print("x + y =", x + y) # checking if the sum is both the variables is equal to 7.3 print((x + y) == 7.3)
Output
On executing, the above program will generate the following output −
x + y = 7.300000000000001 False
These errors are a "feature" of the CPU that underlies the system and the IEEE 754 arithmetic standard that is used by its floating-point unit. There is nothing you can do to prevent such mistakes if you write your code using float instances because Python's float data type saves data using the native representation.
Using the decimal module will give you greater accuracy at the cost of some performance. Let us see it below.
Method 1: Using Decimal() function of the decimal Module
Example
The following program shows the use of the Decimal() function to perform accurate decimal calculations −
# importing Decimal from decimal module from decimal import Decimal x = Decimal('4.2') y = Decimal('3.1') # printing the sum of both the variables print("x + y =", x + y) # checking if the sum is both the variables is equal to 7.3 using by passing the sum to the Decimal Function print((x + y) == Decimal('7.3'))
Output
On executing, the above program will generate the following output −
x + y = 7.3 True
In the above code, it could appear a little strange at first i.e., specifying numbers as strings. Nevertheless, decimal objects work exactly as you would want them to (supporting all common math operations, etc.). They appear like regular numbers when you print them or utilize them in string formatting functions.
The ability to control several aspects of calculations, such as the number of digits and rounding, is a key feature of decimal.
Example
To perform this, create a local context and modify its settings.
# importing localcontext from decimal module from decimal import localcontext x = Decimal('2.3') y = Decimal('2.7') # dividing x by y(returns as a floating-point number) print(x / y) with localcontext() as context: # rounding the number upto 3 digits i.e, precision 3 context.prec = 3 # Dividing x by y with precision set to 3 print(x / y)
Output
On executing, the above program will generate the following output −
0.8518518518518518518518518519 0.852
Incrementing the precision value to ‘60’ for higher accuracy
Example
# importing localcontext from decimal module import decimal from decimal import localcontext x = decimal.Decimal('2.3') y = decimal.Decimal('2.7') # dividing x by y(returns as a floating-point number) print(x / y) with localcontext() as context: # Rounding the number upto 60 digits i.e, precision 60 context.prec = 60 # Dividing x by y with precision set to 3 print(x / y)
Output
On executing, the above program will generate the following output −
0.8518518518518518518518518519 0.851851851851851851851851851851851851851851851851851851851852
Method 2: Using the fsum() function of the math module
The decimal module implements the "General Decimal Arithmetic Specification" of IBM.
It goes without saying that there are a good amount of customizing choices that go beyond this article.
Python beginners might be tempted to utilize the decimal module to get around float data type's reported accuracy issues. It's important to know your application domain, too. It's simply more typical to utilize the normal floating-point type when working with science or engineering problems, computer graphics, or most other things of a scientific nature.
For example, relatively few elements in the actual world are measured with the accuracy of 17 digits offered by floats. Therefore, even minute calculational errors have no impact. The speed of native floats is also noticeably faster, which is crucial if you need to run a lot of calculations.
Example
However, you can't fully avoid the errors. Numerous algorithms have been studied extensively by mathematicians, and some are better than others at handling errors. Additionally, consequences resulting from practices like subtractive cancellation and adding large and small numbers require some care.
inputList = [1.23e+18, 1, -1.23e+18] # observe how the 1 disappears here if we perform sum() on the list print(sum(inputList))
Output
On execution, the above program will generate the following output −
0.0
fsum() finds the sum between a given range or an iterable. It needs the import of the math library. Its widely used in mathematical calculations.
Syntax
Below is the syntax of the function.
maths.fsum( iterable )
The iterable can be a range, array, or list.
Return Type −
It returns a floating point number.
Example
The following example can be used to address a more accurate implementation in math.fsum() −
# importing math module import math # input list inputList = [1.23e+18, 1, -1.23e+18] # adding the sum of elements of the list using the fsum() function print(math.fsum(inputList))
Output
On executing, the above program will generate the following output −
1.0
In contrast, you actually need to research and understand the error propagation properties of other algorithms.
Despite all of this, programs that deal with subjects like finance are where the decimal module is most frequently used. It is incredibly unpleasant when tiny inaccuracies appear in such systems' calculations.
The decimal module thus offers a means of avoiding that. When Python interfaces with databases, Decimal objects are frequently encountered again, especially when accessing financial data.
Conclusion
We learned in this article how normal calculations fail in particular instances and why we require correct decimal calculations. We learned how to perform accurate decimal calculations with two separate functions: decimal() and fsum(). We also learned how to use the localcontext() function to set the precision of the result.
- Related Articles
- How to perform Calculations with Dictionaries in Python?
- Perform calculations to determine CSS property values
- How to perform image transpose using OpenCV Python?
- How to Perform Numpy Broadcasting using Python using dynamic arrays?
- How to perform image translation using OpenCV in Python?
- How to perform image rotation in OpenCV using Python?
- How to perform dimensionality reduction using Python Scikit-learn?
- How to Convert Decimal to Binary Using Recursion in Python?
- How to Convert Decimal to Binary, Octal, and Hexadecimal using Python?
- How to perform square root without using math module in Python?
- How to perform sort using Java?
- How to perform arithmetic across columns of a MySQL table using Python?
- How to perform different simple thresholding of an image using Python OpenCV?
- Perform mathematical calculations in a MySQL table with NULL and NON-NULL values
- How to perform Otsu's thresholding on an image using Python OpenCV?
