Asserting two float numbers are the same is a very difficult problem
TL;DR: Don't compare floats
Problems
Wrong test results
Fragile tests
Fail fast principle violation
Solutions
Avoid floats unless you have REAL performance concerns
Use arbitrary precision numbers
If you need to compare floats compare with tolerance.
Context
Comparing float numbers is an old computer science problem.
The usual solution is to use threshold comparisons.
We recommend avoiding floats at all and trying to use infinite precision numbers.
Sample Code
Wrong
Assert.assertEquals(0.0012f, 0.0012f); // Deprecated
Assert.assertTrue(0.0012f == 0.0012f); // Not JUnit - Smell
Right
Assert.assertEquals(0.0012f, 0.0014f, 0.0002); // true
Assert.assertEquals(0.0012f, 0.0014f, 0.0001); // false
// last parameter is the delta threshold
Assert.assertEquals(12 / 10000, 12 / 10000); // true
Assert.assertEquals(12 / 10000, 14 / 10000); // false
Detection
[X] Automatic
We can add a check con assertEquals() on our testing frameworks to avoid checking for floats.
Tags
- Test Smells
Conclusion
We should always avoid comparing floats.
Relations
Code Smell 71 - Magic Floats Disguised as Decimals
Maxi Contieri ・ May 24 '21
More Info
Credits
Photo by Mika Baumeister on Unsplash
God made the natural numbers; all else is the work of man.
Leopold Kronecker
Software Engineering Great Quotes
Maxi Contieri ・ Dec 28 '20
This article is part of the CodeSmell Series.
Top comments (0)