этаж(24,24*1e4) возвращает неверное значение


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

$res = floor(24.24*1e4)/1e4;
echo $res;

Возвращает 24.2399

Знаете ли вы, что такого особенного в этом 242400, что он возвращает 242399?

 4
Author: Ilmars, 2013-04-26

2 answers

Проблема связана с точностью с плавающей запятой

Несмотря на то, что в руководстве по PHP сказано "Возвращает следующее наименьшее целочисленное значение, округляя значение, если необходимо". если вы прочтете дальше страницу "возвращаемые значения" в руководстве по PHP для floor(), вы увидите:

Значение округлено до следующего наименьшего целого числа . Возвращаемое значение floor() все еще имеет тип float, потому что диапазон значений float обычно больше чем у целого числа.

При проверке типов с плавающей точкой мы видим предупреждение:

Числа с плавающей запятой имеют ограниченную точность. Хотя это зависит от системы, PHP обычно использует формат двойной точности IEEE 754, который даст максимальную относительную ошибку из-за округления порядка 1.11e-16. Неэлементарные арифметические операции могут давать большие ошибки и, конечно же, распространение ошибок необходимо учитывать, когда выполняется несколько операций. усугубленный.

 3
Author: AbsoluteƵERØ, 2013-04-26 08:22:10

Ваша ошибка связана с плавающим значением, иногда это случается.

Вы пробовали это?

$res = floor((int)(24.24*1e4))/1e4;
echo $res;

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

Для вашего примера:

round($res, 4)
 1
Author: Tom-pouce, 2013-04-26 08:12:15