34

我有一个方法可以返回像 1.234567890 这样的浮点数。我想测试它是否确实如此。但是,这个返回的浮点数似乎在不同的平台上具有不同的精度,那么我如何断言返回的值为 1.23456789?如果我这样做:

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

那么这可能会在某些精度不够的平台上失败。

4

5 回答 5

74

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);
于 2013-01-18T14:03:54.047 回答
6

作为@bernhard-wagner 答案的更新,您现在应该使用assertEqualsWithDelta() phpunit 7.5

$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);
于 2019-04-17T15:04:50.483 回答
4

一般来说,测试内置浮点数是否相等是个坏主意。由于浮点表示的准确性问题,两种不同计算的结果在数学上可能完全相等,但在 PHP 运行时比较它们时会有所不同。

解决方案1:比较它们之间的距离。比如说,如果绝对差值小于 0.000001,则您将这些值视为相等。

解决方案 2:使用任意精度数学,它支持任意大小和精度的数字,表示为字符串。

于 2009-12-28T14:04:14.537 回答
3

为了获得更高的准确性,您可以考虑使用BCMath

于 2009-12-26T10:32:43.880 回答
0

或者使用 bcmath() 您还可以设置默认精度,如下所示:

ini_set('precision', 14);
于 2009-12-26T10:59:58.390 回答