CodeQL documentation

Equality check on floating point values

ID: cs/equality-on-floats
Kind: problem
Severity: warning
Precision: medium
   - reliability
   - correctness
Query suites:
   - csharp-security-and-quality.qls

Click to see the query in the CodeQL repository

Directly comparing two floating point values is dangerous due to the imprecision encountered when storing and performing arithmetic on them.


Floating point numbers should be treated as equal if the difference between their values is within a certain margin of error. The appropriate margin of error depends on the situation in which it is used.

As a cautionary note, floating-point comparison is a non-trivial topic, and our documentation here takes a pragmatic approach rather than trying to do it justice. You are strongly advised to consult the references for further information.


Although you might expect this example to output “True” it actually outputs “False” due to the imprecise way floating point arithmetic is performed.

class EqualityCheckOnFloats
    public static void Main(string[] args)
        Console.WriteLine((0.1 + 0.2) == 0.3);

The class should be changed to perform a comparison with a tolerance value as in the following example.

class EqualityCheckOnFloatsFix
    public static void Main(string[] args)
        const double EPSILON = 0.001;
        Console.WriteLine(Math.Abs((0.1 + 0.2) - 0.3) < EPSILON);