Итак, мне нужно создать следующие функции, но моя голова не может думать о какой-либо возможности в PHP без сложной математики.
Я искал в Google 2 часа, и единственное, что появилось, – это форумы Excel. Возможно ли это с помощью некоторых простых строк PHP?
Так как вы ищете четверть ( .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