У меня проблема с участием number_format
в PHP мой код выглядит так,
number_format($my_number_with_decimal, 2, '.', ', ');
Однако, если у меня будет такой номер, как этот 111.115
это превратится в 111.12
это НЕ то, что я хотел показать, так как он явно округлил десятичные числа. Есть ли обходной путь, при котором я могу ограничить десятичные числа до 2, и в то же время он не будет округляться в большую или меньшую сторону? Пожалуйста помоги. Заранее спасибо.
То, что вы хотите, логически невозможно:
11.11 <= 11.115 <= 11.12
Усечение 11.115
в 11.11
округляется, независимо от того, как вы на это смотрите.
Если вы хотите сохранить только первые 2 цифры, просто выполните:
floor($my_number_with_decimal * 100) / 100;
Это эквивалентно округлению вниз.
Ты можешь попробовать floor()
Вы можете иметь этот UDF:
function mine($num,$n=0){ //$n is number of decimal places
return (floor($num*(pow(10,$n)))*pow(10,$n));
}
И назовите это:
mine(111.115,2);
который должен вернуться 111.11
,
Как указал @Marc B, усечение равно floor
, Таким образом, вы можете использовать простую математику к определенному числу цифр:
echo floor($input * 100) / 100;
Имейте в виду, что floor
основан на значениях с плавающей точкой, которые не очень точны. Вы можете получить странные результаты на больших количествах. bc
Семейство функций может выполнять математику с плавающей запятой без проблем с округлением или полом!
http://php.net/manual/en/function.floor.php
это функция пола, которая использует функции bc. Попробуйте, если у вас есть проблемы с полом.
function floor($number, $prec = 0) {
$number = $number * pow(10,$prec);
$number = bcdiv($number, pow(10,$prec), $prec);
return $number;
}
Вы знаете, сколько есть целых чисел?
Предполагая, что вы делаете, вы можете отрезать его, нарезав его. Скажем, например, с вашим номером в целочисленном формате:
$numberWithDecimal = (string)$numberWithDecimal;
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
$numberWithDecimal = (int)$numberWithDecimal;
Если число уже в строковом формате, вы можете просто сделать:
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
Это может быть не самым лучшим или самым чистым, и это не проверено, но я надеюсь, что помогу.
Уродливый путь:
$number = 111.115;
preg_match('/([^.]*\.\d{0,2})/', $number, $match);
echo number_format($match[1], 2, '.', ',');