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


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

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

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

Author: Gordon, 2009-12-26

4 answers

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

 4
Author: Sarfraz, 2009-12-26 10:32:43

До сих пор не упоминалось, что assertEquals поддерживает сравнение поплавков, предлагая дельту для определения точности: https://phpunit.de/manual/current/en/appendixes.assertions.html#appendixes.assertions.assertEquals.example2

$this->assertEquals(1.23456789, $float, '', 0.0001);
 51
Author: Bernhard Wagner, 2016-04-13 21:32:15

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

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

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

 3
Author: Ivan Krechetov, 2009-12-28 14:11:08

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

ini_set('precision', 14);
 0
Author: Alix Axel, 2009-12-26 10:59:58