Значение 30000 / 28
не является целым числом и не может быть точно представлено.Возникает небольшая ошибка округления.Значение, представленное в компьютере, немного меньше точного математического значения выражения.При умножении на 28
результат немного меньше, чем 30000
, и floor()
делает то, что должен: игнорирует десятичную часть и возвращает только целую часть, равную 29999
.
Значение 30000 / 28 * 28
в том виде, как оно представлено в компьютерах, составляет приблизительно 29999.9999999999963620211929082870
.
Подробнее о представлении с плавающей запятой и проблемах, с которыми вы можете столкнуться при его использовании: https://floating -point-gui.de /
Это не проблема PHP или представления чисел в числах с плавающей точкой.Это то, что также происходит в реальной жизни.
Обычно мы считаем, что 1/3
- это 0.333333333333333...
, но независимо от того, сколько 3
мы ставим после десятичной точки, умножение на 3
не делает 'т производства ровно 1