Глупо, не могу разобраться в php с округлением в меньшую сторону : (

#php

#php

Вопрос:

У меня небольшая проблема, и где-то это может быть глупо, но все же она у меня есть 🙂

Итак, проблема в:

Делая это

 round(615.36*0.10, 2, PHP_ROUND_HALF_DOWN);
  

Я ожидаю, что результат будет 61.53 , но это 61.54 .

 phpVersion = 5.3.2
  

Кто-нибудь может помочь мне решить это?
Спасибо.

Ответ №1:

PHP_ROUND_HALF_DOWN округлит половину, то есть 0.005 часть.

если у вас есть 61.535 , использование PHP_ROUND_HALF_DOWN даст вам 61.53 — вместо 61.54 того, что вы должны были получить с обычным округлением.
В принципе, .005 половина была округлена в меньшую сторону.

Но 61.536 это не половина : .006 больше .005 ; поэтому округление этого значения дает 61.54 .


В вашем случае вы могли бы умножить значение на 100, использовать функцию floor() и разделить результат на 100 — я полагаю, это дало бы вам то, что вы ожидаете :

 $value = 61.536;
$value_times_100 = $value * 100;
$value_times_100_floored = floor($value_times_100);
$value_floored = $value_times_100_floored / 100;
var_dump($value_floored);
  

Дает мне :

 float(61.53) 
  

Ответ №2:

Если вы хотите округлить в меньшую сторону, вам нужно будет использовать floor () , у которого нет средств для указания точности, поэтому его нужно обойти, например. с

 function floor_prec($x, $prec) {
   return floor($x*pow(10,$prec))/pow(10,$prec);
}
  

Ответ №3:

очевидно, что вам нужно только два знака после запятой, почему бы просто не number_format(615.36 * 0.10, 2)

Комментарии:

1. да, это именно то, что я хочу, но поскольку это был не мой вопрос, я могу только дать вам положительный ответ. Спасибо

2. Это не работает, так как округляет в большую сторону: float 15.315315315315 => string '15.32'