Home » Php » PHP and unit testing assertions with decimals

# PHP and unit testing assertions with decimals

Questions:

I have a method that returns a float like 1.234567890.I want to test that it really does so. However, it seems that this returned float has different precision on different platforms so how do I assert that the returned value is 1.23456789? If I just do:

``````\$this->assertEqual(1.23456789, \$float);
``````

Then that might fail on some platforms where there is not enough precision.

So far it hasn’t been mentioned that assertEquals supports comparing floats by offering a delta to specifiy precision:

``````\$this->assertEquals(1.23456789, \$float, '', 0.0001);
``````

Thanks to @Antoine87 for pointing out: since phpunit 7.5 you should use `assertEqualsWithDelta()`:

``````\$this->assertEqualsWithDelta(1.23456789, \$float, 0.0001);
``````

###

As an update to @bernhard-wagner answer, you should now use `assertEqualsWithDelta()` since phpunit 7.5.

``````\$this->assertEqualsWithDelta(1.23456789, \$float, 0.0001);
``````

###

In general, it’s a bad idea to test built-in floats for equality. Because of accuracy problems of floating point representation, the results of two different calculations may be perfectly equal mathematically, but different when you compare them at your PHP runtime.

Solution 1: compare how far apart they are. Say, if the absolute difference is less than 0.000001, you treat the values as equal.

Solution 2: use arbitrary precision mathematics, which supports numbers of any size and precision, represented as strings.

###

For greater accuracy you may consider using BCMath.

###

Alternatively of using bcmath() you can also set the default precision, like this:

``````ini_set('precision', 14);
``````