我有一个方法可以返回像 1.234567890 这样的浮点数。我想测试它是否确实如此。但是,这个返回的浮点数似乎在不同的平台上具有不同的精度,那么我如何断言返回的值为 1.23456789?如果我这样做:
$this->assertEqual(1.23456789, $float);
那么这可能会在某些精度不够的平台上失败。
我有一个方法可以返回像 1.234567890 这样的浮点数。我想测试它是否确实如此。但是,这个返回的浮点数似乎在不同的平台上具有不同的精度,那么我如何断言返回的值为 1.23456789?如果我这样做:
$this->assertEqual(1.23456789, $float);
那么这可能会在某些精度不够的平台上失败。
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);
作为@bernhard-wagner 答案的更新,您现在应该使用assertEqualsWithDelta()
phpunit 7.5。
$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);
一般来说,测试内置浮点数是否相等是个坏主意。由于浮点表示的准确性问题,两种不同计算的结果在数学上可能完全相等,但在 PHP 运行时比较它们时会有所不同。
解决方案1:比较它们之间的距离。比如说,如果绝对差值小于 0.000001,则您将这些值视为相等。
解决方案 2:使用任意精度数学,它支持任意大小和精度的数字,表示为字符串。
为了获得更高的准确性,您可以考虑使用BCMath。
或者使用 bcmath() 您还可以设置默认精度,如下所示:
ini_set('precision', 14);