#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'