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

Итак, мне нужно создать следующие функции, но моя голова не может думать о какой-либо возможности в 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)
  • Равномерно вниз до ближайшего x.25 / x.50 / x.75 / x.00 (1.81 = 1.75, 1.32 = 1.25)
  • Круглый всегда до ближайшего x.50 / 1 (1,23 = 1,50, 1,83 = 2)
  • Равномерно вниз до ближайшего x.50 / 1 (1,23 = 1, 1,83 = 1,50)

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

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

Так как вы ищете четверть ( .00 , .25 , .50 , .75 ), умножьте число на 4, округлите до ближайшего целого числа по желанию ( floor если вниз, ceil если вверх), а затем разделите на 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 

Обратите внимание, что ответ на самом деле не является водонепроницаемым. Поскольку мы имеем дело с поплавками здесь, не гарантируется, что когда вы делите округленное число на знаменатель, он возвращает аккуратно округленное число. Он может вернуть 1.499999999999 вместо 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