Problem in comparing Floating point numbers and how to compare them correctly?

28 Jan, 2022
In this article, we will see what is the problem in comparing floating-point numbers and we will discuss the correct way to compare two floating-point numbers. What is the problem in comparing Floating-Point Numbers usually?Let us first compare two floating-point numbers with the help of relational operator (==).Example: Using “==” for comparison 
CPP
Java
Python
C#
Javascript
// C++ program to compare// floating point numbers #include <bits/stdc++.h>using namespace std; void compareFloatNum(double a, double b){    if (a == b) {        cout << "The numbers are equal"             << endl;    }    else {        cout << "The numbers are not equal"             << endl;    }} // Driver codeint main(){    double a = (0.3 * 3) + 0.1;    double b = 1;    compareFloatNum(a, b);}
// Java program to compare// floating point numbersclass GFG{     static void compareFloatNum(double a, double b)    {        if (a == b)        {            System.out.print("The numbers are equal" + "\n");        }        else        {            System.out.print("The numbers are not equal" + "\n");        }    }     // Driver code    public static void main(String[] args)    {        double a = (0.3 * 3) + 0.1;        double b = 1;        compareFloatNum(a, b);    }} // This code is contributed by 29AjayKumar
# Python program to compare# floating point numbersdef compareFloatNum(a, b):    if (a == b):        print("The numbers are equal")     else:        print("The numbers are not equal") # Driver code a = (0.3 * 3) + 0.1b = 1compareFloatNum(a, b) # This code is contributed by mohit kumar 29
// C# program to compare// floating point numbersusing System; class GFG{     static void comparefloatNum(double a, double b)    {        if (a == b)        {            Console.Write("The numbers are equal" + "\n");        }        else        {            Console.Write("The numbers are not equal" + "\n");        }    }     // Driver code    public static void Main(String[] args)    {        double a = (0.3 * 3) + 0.1;        double b = 1;        comparefloatNum(a, b);    }} // This code is contributed by PrinciRaj1992
<script> function compareFloatNum(a,b){    if (a == b)        {            document.write("The numbers are equal" + "<br>");        }        else        {            document.write("The numbers are not equal" + "<br>");        }} let a = (0.3 * 3) + 0.1; let b = 1; compareFloatNum(a, b);  // This code is contributed by patel2127 </script>
The numbers are not equal
 
Why does this problem occur?In the case of floating-point numbers, the relational operator (==) does not produce correct output, this is due to the internal precision errors in rounding up floating-point numbers.In the above example, we can see the inaccuracy in comparing two floating-point numbers using “==” operator. The two numbers ‘a’ and ‘b’ are equal ( as (0.3 * 3) + 0.1 = 1 ) but the program results in an incorrect output.Let’s take a closer look at the numbers in the next snippet. 
CPP
Python3
// C++ program to compare// floating point numbers #include <bits/stdc++.h>using namespace std; void printFloatNum(double a, double b){    // To print decimal numbers up to 20 digits    cout << setprecision(20);     cout << "a is : " << a << endl;    cout << "b is : " << b << endl;} // Driver codeint main(){    double a = (0.3 * 3) + 0.1;    double b = 1;    printFloatNum(a, b);}
# Python 3 program to compare# floating point numbersdef printFloatNum(a,  b):     # To print decimal numbers up to 20 digits    print("a is : %.20f" %a)    print("b is : %.20f" %b) # Driver codeif __name__ == "__main__":     a = (0.3 * 3) + 0.1    b = 1    printFloatNum(a, b)     # This code is contributed by ukasp.
a is : 0.99999999999999988898
b is : 1
 
Now we can see the internal rounding error in floating-point numbers. Number ‘a’ is not correctly rounded up to 1, there is an internal error in rounding up, a very small error but makes a huge difference when we are comparing the numbers.How to compare floating-point numbers correctly? If we do have to compare two floating-point numbers then rather than using “==” operator we will find the absolute difference between the numbers (which if were correctly represented, the difference would have been 0) and compare it with a very small number 1e-9 (i.e 10^-9, this number is very small) and if the difference is less than this number, we can safely say that the two floating-point numbers are equal.Example:  
C++
Java
Python3
C#
Javascript
// C++ program to compare// floating point numbers correctly #include <bits/stdc++.h>using namespace std; void compareFloatNum(double a, double b){     // Correct method to compare    // floating-point numbers    if (abs(a - b) < 1e-9) {        cout << "The numbers are equal "             << endl;    }    else {        cout << "The numbers are not equal "             << endl;    }} // Driver codeint main(){    double a = (0.3 * 3) + 0.1;    double b = 1;    compareFloatNum(a, b);}
// Java program to compare// floating point numbers correctlyclass GFG{ static void compareFloatNum(double a, double b){     // Correct method to compare    // floating-point numbers    if (Math.abs(a - b) < 1e-9)    {        System.out.print("The numbers are equal "            +"\n");    }    else    {        System.out.print("The numbers are not equal "            +"\n");    }} // Driver codepublic static void main(String[] args){    double a = (0.3 * 3) + 0.1;    double b = 1;    compareFloatNum(a, b);}} // This code is contributed by Rajput-Ji
# Python program to compare# floating point numbers correctly def compareFloatNum(a, b):         # Correct method to compare    # floating-point numbers    if (abs(a - b) < 1e-9):        print("The numbers are equal ");    else:        print("The numbers are not equal ");     # Driver codeif __name__ == '__main__':    a = (0.3 * 3) + 0.1;    b = 1;    compareFloatNum(a, b); # This code is contributed by PrinciRaj1992
     // C# program to compare// floating point numbers correctlyusing System; class GFG{ static void comparefloatNum(double a, double b){     // Correct method to compare    // floating-point numbers    if (Math.Abs(a - b) < 1e-9)    {        Console.Write("The numbers are equal "            +"\n");    }    else    {        Console.Write("The numbers are not equal "            +"\n");    }} // Driver codepublic static void Main(String[] args){    double a = (0.3 * 3) + 0.1;    double b = 1;    comparefloatNum(a, b);}} // This code is contributed by 29AjayKumar
<script>// Javascript program to compare// floating point numbers correctly function compareFloatNum(a,b){    // Correct method to compare    // floating-point numbers    if (Math.abs(a - b) < 1e-9)    {        document.write("The numbers are equal "            +"<br>");    }    else    {        document.write("The numbers are not equal "            +"<br>");    }} // Driver codelet a = (0.3 * 3) + 0.1;let b = 1;compareFloatNum(a, b); // This code is contributed by unknown2108</script>
The numbers are equal
 
This code results in the correct output, so whenever two floating point numbers are two be compared then rather than using “==” operator, we will use the above technique. 
mohit kumar 29
29AjayKumar
princiraj1992
Rajput-Ji
patel2127
unknown2108
ukasp
simmytarika5
C Language
C++
Java
Programming Language
Technical Scripter
Java
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Unordered Sets in C++ Standard Template Library
What is the purpose of a function prototype?
Operators in C / C++
Exception Handling in C++
Smart Pointers in C++ and How to Use Them
Vector in C++ STL
Map in C++ Standard Template Library (STL)
Initialize a vector in C++ (7 different ways)
Set in C++ Standard Template Library (STL)
unordered_map in C++ STL