этаж(24,24*1e4) возвращает неверное значение
Выполняя округление некоторых координат, я наткнулся на какую-то ошибку или что-то в этом роде, с разными числами это работает так, как мне нужно
$res = floor(24.24*1e4)/1e4;
echo $res;
Возвращает 24.2399
Знаете ли вы, что такого особенного в этом 242400, что он возвращает 242399?
2 answers
Проблема связана с точностью с плавающей запятой
Несмотря на то, что в руководстве по PHP сказано "Возвращает следующее наименьшее целочисленное значение, округляя значение, если необходимо". если вы прочтете дальше страницу "возвращаемые значения" в руководстве по PHP для floor(), вы увидите:
Значение округлено до следующего наименьшего целого числа . Возвращаемое значение
floor()
все еще имеет тип float, потому что диапазон значений float обычно больше чем у целого числа.
При проверке типов с плавающей точкой мы видим предупреждение:
Числа с плавающей запятой имеют ограниченную точность. Хотя это зависит от системы, PHP обычно использует формат двойной точности IEEE 754, который даст максимальную относительную ошибку из-за округления порядка 1.11e-16. Неэлементарные арифметические операции могут давать большие ошибки и, конечно же, распространение ошибок необходимо учитывать, когда выполняется несколько операций. усугубленный.
Ваша ошибка связана с плавающим значением, иногда это случается.
Вы пробовали это?
$res = floor((int)(24.24*1e4))/1e4;
echo $res;
Или вы можете использовать округление с необязательным параметром для округления до определенного десятичного знака.
Для вашего примера:
round($res, 4)