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