1.234567890のようなfloatを返すメソッドがあります。実際にそうなることをテストしたいと思います。ただし、この返されたフロートはプラットフォームごとに精度が異なるようです。戻り値が1.23456789であるとどのように主張しますか?私がするだけなら:
$this->assertEqual(1.23456789, $float);
次に、十分な精度がない一部のプラットフォームでは失敗する可能性があります。
1.234567890のようなfloatを返すメソッドがあります。実際にそうなることをテストしたいと思います。ただし、この返されたフロートはプラットフォームごとに精度が異なるようです。戻り値が1.23456789であるとどのように主張しますか?私がするだけなら:
$this->assertEqual(1.23456789, $float);
次に、十分な精度がない一部のプラットフォームでは失敗する可能性があります。
これまでのところ、assertEqualsが特定の精度へのデルタを提供することによってフロートの比較をサポートすることについては言及されていません。
$this->assertEquals(1.23456789, $float, '', 0.0001);
指摘してくれた@Antoine87に感謝します:phpunit 7.5以降、使用する必要がありますassertEqualsWithDelta()
:
$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);
@ bernhard-wagnerの回答の更新として、assertEqualsWithDelta()
phpunit7.5以降を使用する必要があります。
$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);
一般に、組み込みのフロートが等しいかどうかをテストすることはお勧めできません。浮動小数点表現の精度の問題のため、2つの異なる計算の結果は数学的には完全に等しい場合がありますが、PHP実行時にそれらを比較すると異なります。
解決策1:それらがどれだけ離れているかを比較します。たとえば、絶対差が0.000001未満の場合、値は等しいものとして扱います。
解決策2:任意の精度の数学を使用します。これは、文字列として表される、任意のサイズと精度の数値をサポートします。
精度を高めるために、BCMathの使用を検討してください。
bcmath()を使用する代わりに、次のようにデフォルトの精度を設定することもできます。
ini_set('precision', 14);