Skip to main content

Command Palette

Search for a command to run...

Code Smell 108 - Float Assertions

Asserting two float numbers are the same is a very difficult problem

Published
1 min read
Code Smell 108 - Float Assertions
M

I’m a senior software engineer loving clean code, and declarative designs. S.O.L.I.D. and agile methodologies fan.

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

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.

Code Smells

Part 1 of 50

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.

Code Smell 108 - Float Assertions