Попалась мне задачка, которую не могу расколдовать. Надеюсь и упаваю на помощь сообщества. Итак, надо округлить до 2 знаков после запятой значение выражения 27.26×1.21. До округления получается 32.9849, после округления — какая-то чепуха. Потому что должно быть 32.99, а возвращает 32.98. При этом округление 0.5 до целых возвращает вовсе не 0, а 1. PHP: echo 27.26*1.21; // = 32.9846 echo number_format(27.26*1.21,3); // = 32.985 echo number_format(27.26*1.21,2); // = 32.98 echo bcmul(27.26, 1.21, 2); // = 32.98 echo number_format(0.5); // = 1 echo number_format(32.985,2); // = 32,99 Подскажите, пожалуйста, что с этой бедой делать? Округлять сначала до трёх после запятой, а потом полученние до двух? Или есть всё же более разумный способ, который мне не удалось нагуглить?
Почитать про number_format(), он ничего не округляет в принципе https://php.ru/manual/function.round.html
@ADSoft согласен, конечно, но round ситуации не меняет никак: PHP: echo round(27.26*1.21, 2); // = 32.98 echo round(27.26*1.21, 2, PHP_ROUND_HALF_UP); // = 32.98
Потому что пятерка округляется вверх: 32.9846 = 32.985 = 32.99. От 0 до 4 — в меньшую сторону, от 5 до 9 — в большую. round(32.9846, 3) вернет 32.985. round(32.985,2) вернет 32.99. Почему round(32.9846, 2) возвращает 32.98?
@Moor в твоем примере в number_format() ты передаешь 32.985 в то время как 27.26*1.21 = 32.9846. Поэтому получается 32.99. Функция round() даст тот же результат. По математическому правилу, 32.984 должно округляться до 32.98. Чтобы понять, почему это так, вот в качестве примера числа 0.45. Оно не округляется до единицы. До единицы округляется как минимум 0.5, которое больше, чем 0.45. --- Добавлено --- @Moor вот классный материал на тему ошибки двойного округления.
@[vs] интересно, я всегда считал, что округление происходит поэтапно с конца, пока не округлится соответствующий разряд. Ну то есть 0.46 при округлении до целых сначала округляется до 0.5, потом до 1. Окей, надо признать, что был неправ.