PHP и модульное тестирование утверждений с десятичными знаками - PullRequest
25 голосов
/ 26 декабря 2009

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

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

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

Ответы [ 5 ]

55 голосов
/ 18 января 2013

До сих пор не было упомянуто, что 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);
4 голосов
/ 26 декабря 2009

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

3 голосов
/ 28 декабря 2009

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

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

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

0 голосов
/ 17 апреля 2019

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

$this->assertEqualsWithDelta(1.23456789, $float, 0.0001);
0 голосов
/ 26 декабря 2009

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

ini_set('precision', 14);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...