34

1.234567890のようなfloatを返すメソッドがあります。実際にそうなることをテストしたいと思います。ただし、この返されたフロートはプラットフォームごとに精度が異なるようです。戻り値が1.23456789であるとどのように主張しますか?私がするだけなら:

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

次に、十分な精度がない一部のプラットフォームでは失敗する可能性があります。

4

5 に答える 5

74

これまでのところ、assertEqualsが特定の精度へのデルタを提供することによってフロートの比較をサポートすることについては言及されていません。

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

指摘してくれた@Antoine87に感謝します:phpunit 7.5以降、使用する必要がありますassertEqualsWithDelta()

$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);
于 2013-01-18T14:03:54.047 に答える
6

@ bernhard-wagnerの回答の更新として、assertEqualsWithDelta() phpunit7.5以降を使用する必要があります。

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

一般に、組み込みのフロートが等しいかどうかをテストすることはお勧めできません。浮動小数点表現の精度の問題のため、2つの異なる計算の結果は数学的には完全に等しい場合がありますが、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 に答える