floor () в php не работает

<?php
echo gettype ( 5.00 );                                  // return double
echo gettype((5));                                      // return integer
echo gettype(((167.00-158.65)/167.00*100));             // return double

echo floor(5.00);                                       // return 5
echo floor(5);                                          // return 5
echo ((167.00-158.65)/167.00*100);                      // return 5
echo floor(((167.00-158.65)/167.00*100));               // return 4var_dump(5.00);                                         // return float(5)
var_dump(5);                                            // return int(5)
var_dump((167.00-158.65)/167.00*100);                   // return float(5)
var_dump(intval(5));                                    // return int(5)
var_dump(intval((167.00-158.65)/167.00*100));           // return int(4)

echo gettype(intval(((167.00-158.65)/167.00*100)));     // return integer
echo floor(intval((167.00-158.65)/167.00*100));         // return 4
?>

Почему функция пола в php не работает в последнем случае?

Как получить 5 из последнего заявления?
Есть ли какая-либо другая функция или метод в php, чтобы получить точное наименьшее количество?

4

Решение

Такое поведение вызвано ограниченной точностью чисел с плавающей точкой. Последний случай имеет тип float (проверьте это с var_dump), а в руководстве написано:

Предупреждение

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

Кроме того, рациональные числа, которые точно представимы как
Числа с плавающей запятой в базе 10, такие как 0,1 или 0,7, не имеют
точное представление в виде чисел с плавающей точкой в ​​базе 2, которая
используется внутри, независимо от размера мантиссы. Следовательно, они
не могут быть преобразованы в их внутренние двоичные аналоги без
небольшая потеря точности. Это может привести к запутанным результатам: за
Например, floor ((0.1 + 0.7) * 10) обычно возвращает 7 вместо
ожидается 8, так как внутреннее представление будет что-то вроде
+7,9999999999999991118 ….

Источник:

http://php.net/manual/en/language.types.float.php

3

Другие решения

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

<?php
echo floor(4.3);   // 4
echo floor(9.999); // 9
echo floor(-3.14); // -4
?>
2

По вопросам рекламы [email protected]