Ответ 1
Для большей точности вы можете использовать BCMath.
У меня есть метод, который возвращает float, например, 1.234567890.I хочу проверить, что это действительно так. Однако кажется, что этот возвращенный float имеет разную точность на разных платформах, поэтому как я могу утверждать, что возвращаемое значение равно 1.23456789? Если я просто сделаю:
$this->assertEqual(1.23456789, $float);
Тогда это может потерпеть неудачу на некоторых платформах, где недостаточно точности.
Для большей точности вы можете использовать BCMath.
До сих пор не было упомянуто, что assertEquals поддерживает сравнение чисел с плавающей точкой, предлагая дельту для определения точности: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals.example2
$this->assertEquals(1.23456789, $float, '', 0.0001);
Спасибо @Antoine87 за указание на: начиная с phpunit 7.5 вы должны использовать assertEqualsWithDelta()
:
$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);
В общем, это плохая идея протестировать встроенные поплавки для равенства. Из-за проблемы точности представления с плавающей запятой результаты двух разных вычислений могут быть совершенно равны математически, но разные, когда вы сравниваете их на своем PHP во время выполнения.
Решение 1: сравнить, насколько они далеко друг от друга. Скажем, если абсолютная разница меньше 0,000001, вы считаете значения равными.
Решение 2: используйте произвольную точность математики, которая поддерживает числа любого размера и точности, представленные в виде строк.
Альтернативно, используя bcmath(), вы также можете установить точность по умолчанию, например:
ini_set('precision', 14);
В качестве обновления ответа @bernhard-wagner теперь вы должны использовать assertEqualsWithDelta()
начиная с phpunit 7.5.
$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);