Округление до ближайшей фракции (половина, квартал и т.д.)
Итак, мне нужно создать следующие функции, но моя голова не может думать о какой-либо возможности в PHP без сложной математики.
- Круглый всегда до ближайшего десятичного числа (1.81 = 1.90, 1.89 = 1.90, 1.85 = 1.90)
- Round всегда до ближайшего десятичного числа (1.81 = 1.80, 1.89 = 1.80, 1.85 = 1.80)
- Круглый всегда до ближайшего x.25/x.50/x.75/x.00 (1.81 = 2, 1.32 = 1.50)
- Круглый всегда до ближайшего x.25/x.50/x.75/x.00 (1.81 = 1.75, 1.32 = 1.25)
- Round всегда до ближайшего x.50/1 (1.23 = 1.50, 1.83 = 2)
- Круглый всегда до ближайшего x.50/1 (1.23 = 1, 1.83 = 1.50)
Я искал в Google 2 часа, и единственное, что появилось, - это форумы Excel. Возможно ли это с помощью некоторых простых строк PHP?
Ответы
Ответ 1
Так как вы ищете четвертые (.00
, .25
, .50
, .75
), умножьте число на 4, округлите до ближайшего целого числа (floor
, если down, ceil
if up), затем разделите на 4.
1.32, до ближайшего четвертого:
1,32 * 4 = 5,28 - этаж (5.28) = 5.00
5,00/4 = 1,25
Тот же принцип применяется для любых других фракций, таких как третья или восьмая (.0
, .125
, .25
, .375
, .5
, .625
, .75
, .875
). Например:
1.77, до ближайшей восьмой:
1,77 * 8 = 14,16
ceil (14,16) = 15,00
15.00/8 = 1,875
Просто для удовольствия вы можете написать такую функцию:
function floorToFraction($number, $denominator = 1)
{
$x = $number * $denominator;
$x = floor($x);
$x = $x / $denominator;
return $x;
}
echo floorToFraction(1.82); // 1
echo floorToFraction(1.82, 2); // 1.5
echo floorToFraction(1.82, 3); // 1.6666666666667
echo floorToFraction(1.82, 4); // 1.75
echo floorToFraction(1.82, 9); // 1.7777777777778
echo floorToFraction(1.82, 25); // 1.8
Ответ 2
Обратите внимание, что ответ на самом деле не является водонепроницаемым. Поскольку мы имеем дело с поплавками здесь, это не гарантирует, что когда вы делите округленное число на знаменатель, он возвращает аккуратно округленное число. Он может вернуть 1.499999999999 вместо 1.5. Это характер чисел с плавающей запятой.
Еще один раунд необходим, прежде чем возвращать номер из функции.
На всякий случай кто-то приземляется здесь из Google, как я:)
Ответ 3
Посмотрите пример № 3 здесь, и это половина вашего решения - http://php.net/manual/en/function.round.php
Ответ 4
В соответствии с функцией mround()
в Excel:
function MRound($num,$parts) {
$res = $num * $parts;
$res = round($res);
return $res /$parts;
}
echo MRound(-1.38,4);//gives -1.5
echo MRound(-1.37,4);//gives -1.25
echo MRound(1.38,4);//gives 1.5
echo MRound(1.37,4);//gives 1.25