Отрежьте десятичные числа до 2 мест, но НЕ следует округлять их, используя ceil или floor

У меня проблема с участием number_format в PHP мой код выглядит так,

number_format($my_number_with_decimal, 2, '.', ', ');

Однако, если у меня будет такой номер, как этот 111.115 это превратится в 111.12 это НЕ то, что я хотел показать, так как он явно округлил десятичные числа. Есть ли обходной путь, при котором я могу ограничить десятичные числа до 2, и в то же время он не будет округляться в большую или меньшую сторону? Пожалуйста помоги. Заранее спасибо.

0

Решение

То, что вы хотите, логически невозможно:

 11.11 <= 11.115 <= 11.12

Усечение 11.115 в 11.11 округляется, независимо от того, как вы на это смотрите.

4

Другие решения

Если вы хотите сохранить только первые 2 цифры, просто выполните:

floor($my_number_with_decimal * 100) / 100;

Это эквивалентно округлению вниз.

3

Ты можешь попробовать 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,

0

Как указал @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;
}

http://php.net/manual/en/function.bcdiv.php

0

Вы знаете, сколько есть целых чисел?
Предполагая, что вы делаете, вы можете отрезать его, нарезав его. Скажем, например, с вашим номером в целочисленном формате:

$numberWithDecimal = (string)$numberWithDecimal;
$numberWithDecimal = substr($numberWithDecimal, 0, 5);
$numberWithDecimal = (int)$numberWithDecimal;

Если число уже в строковом формате, вы можете просто сделать:

$numberWithDecimal = substr($numberWithDecimal, 0, 5);

Это может быть не самым лучшим или самым чистым, и это не проверено, но я надеюсь, что помогу.

0

Уродливый путь:

$number = 111.115;
preg_match('/([^.]*\.\d{0,2})/', $number, $match);
echo number_format($match[1], 2, '.', ',');
0
По вопросам рекламы [email protected]