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

Итак, мне нужно создать следующие функции но моя голова не может думать о какой-либо возможности в PHP без сложной математики.

  • круглые всегда до ближайшего десятичного знака (1.81 = 1.90, 1.89 = 1.90, 1.85 = 1.90)
  • круглые всегда вниз до ближайшего десятичного знака (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)
  • круглые всегда вниз до ближайшего х.25 / х.50 / х.75 / х.00 (1.81 = 1.75, 1.32 = 1.25)
  • круглые всегда до ближайшего х.50 / 1 (1.23 = 1.50, 1.83 = 2)
  • круглые всегда вниз до ближайшего х.50 / 1 (1.23 = 1, 1.83 = 1.50)

Я искал в Google в течение 2 часов, и единственное, что пришло, были форумы Excel. Возможно ли это с помощью простых строк PHP?

4 ответов


так как вы ищете четвертями (.00, .25, .50, .75), умножьте свое число на 4, округлите до ближайшего целого числа по желанию (floor если вниз, ceil если вверх), то разделить на 4.

1.32, до ближайшего четвертая:

1.32 * 4 = 5.28
пол(5.28) = 5.00
5.00 / 4 = 1.25

тот же принцип применяется для любых других фракций, таких как as трети или восьмушки (.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

обратите внимание, что ответ на самом деле не является водонепроницаемым. Поскольку мы имеем дело с поплавками, не гарантируется, что при делении округленного числа на знаменатель оно возвращает аккуратно круглое число. Он может возвращать 1.49999999999999 вместо 1.5. Такова природа чисел с плавающей запятой.

перед возвратом номера из функции требуется еще один раунд.

на всякий случай, если кто-то приземляется здесь из google, как я сделал :)


посмотрите пример #3 здесь, и это половина вашего решения -http://php.net/manual/en/function.round.php


по словам 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