Подтвердить что ты не робот

Округление до ближайшей фракции (половина, квартал и т.д.)

Итак, мне нужно создать следующие функции, но моя голова не может думать о какой-либо возможности в 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?

4b9b3361

Ответ 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, как я:)

Ответ 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