DEV Community

Cover image for Code Smell 108 - Float Assertions
Maxi Contieri
Maxi Contieri

Posted on • Originally published at maximilianocontieri.com

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

  1. Avoid floats unless you have REAL performance concerns

  2. Use arbitrary precision numbers

  3. 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.

Latest comments (0)