Code Smell 108 - Float Assertions
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
More Info
Credits
Photo by Mika Baumeister on Unsplash
God made the natural numbers; all else is the work of man.
Leopold Kronecker
This article is part of the CodeSmell Series.
About the author
I’m a senior software engineer loving clean code, and declarative designs. S.O.L.I.D. and agile methodologies fan.
Comments
Join the discussionNo comments yet. Be the first to comment.
Code Smells
In this series, we will see several symptoms and situations that make us doubt the quality of our developments. We will present possible solutions. Most are just clues. They are no hard rules.





