Подтвердить что ты не робот

PHP и утверждения модульного тестирования с десятичными знаками

У меня есть метод, который возвращает float, например, 1.234567890.I хочу проверить, что это действительно так. Однако кажется, что этот возвращенный float имеет разную точность на разных платформах, поэтому как я могу утверждать, что возвращаемое значение равно 1.23456789? Если я просто сделаю:

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

Тогда это может потерпеть неудачу на некоторых платформах, где недостаточно точности.

4b9b3361

Ответ 1

Для большей точности вы можете использовать BCMath.

Ответ 2

До сих пор не было упомянуто, что 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);

Ответ 3

В общем, это плохая идея протестировать встроенные поплавки для равенства. Из-за проблемы точности представления с плавающей запятой результаты двух разных вычислений могут быть совершенно равны математически, но разные, когда вы сравниваете их на своем PHP во время выполнения.

Решение 1: сравнить, насколько они далеко друг от друга. Скажем, если абсолютная разница меньше 0,000001, вы считаете значения равными.

Решение 2: используйте произвольную точность математики, которая поддерживает числа любого размера и точности, представленные в виде строк.

Ответ 4

Альтернативно, используя bcmath(), вы также можете установить точность по умолчанию, например:

ini_set('precision', 14);

Ответ 5

В качестве обновления ответа @bernhard-wagner теперь вы должны использовать assertEqualsWithDelta() начиная с phpunit 7.5.

$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);