php округлить до большего целого
Функция округления в большую сторону
Возникла следующая проблема. Нужна функция для округления числа до сотых в большую сторону. Изначально функция имела следующий вид:
но возникла проблема при передаче в функцию следующего значения round_up(740*0.006,2) она выдает 4,45 вместо 4,44. Далее функцию подкорректировал в следующий вид:
предыдущую проблему решила, но возникла также новая при передаче в функцию след.значения:
она выдает 19,25 вместо 19,26. Может кто уже сталкивался с таким? Заранее большое спасибо.
3 ответа 3
Тогда, первая приведенная вами функция работает правильно, но ошибка возникает из-за погрешности вычислений. я думаю, что pow ( 10, 2.0 ) выдаст не ровно 100 а что-то типа 100.000001 Если необходимо округлять строго до 2 знаков попробуйте
Извините, Вы пытаетесь придумать новый способ округления? Почему это 3208,34*0,006 должно давать 19,26? Если результат без округления равно 19,25004. Рекомендую ознакомиться с существующими общепринятыми правилами округления, ведь вы используете в своей функции функцию ceil, которая основана на правилах округления. А если Вы пытаетесь использовать правило, которую сами придумываете, то тут уже Вам придется полностью переписать свой алгоритм округления.
Основная беда при работе с числами с плавающей точкой в том, что их внутреннее представление может отличаться, да и почти всегда отличается от десятичного. То бишь изначально, часто они являются иррациональными числами в десятичном представлении.
Для учёта отрицательных чисел надо добавить соответствующую проверку.
WEB IT blog
Блог про веб-разработку, администрирование, дизайн
PHP, округление до десятков и сотен в большую сторону
четверг, 10 ноября 2011 г.
Чтобы цена товара в интернет-магазине не была отпугивающей для посетителя, иногда нужно округлить её до целых десятков. Например, 113 руб до 120 руб, 458 руб до 460 руб.
В PHP есть готовые функции округления ceil и round, но в исходном виде для текущей задачи они не совсем подходят.
Так что кусочек простого и понятного кода вам в помощь:
если 10 сменить на 100, то получим округление до сотен и цена 112.12 превратится в 200 рублей.
19 коммент.:
Да без проблем ) Всегда рад.
Супер! СПасибо! Очень долго искал!
Вариант, если нужно округление например по 5, а не по 10.
Александр, спасибо за вариант!
Все нормальные программисты знают как работает round и ceil, но задача в посте была округлить в большую сторону даже если по логике round() оно должно «окрулиться» в меньшую. Код выше тому пример.
Спасибо за ваше решение данной проблемы!
Отличное решение. Спасибо большое.
извиняюсь. ) со знаком все верно!
$p=($t_p-$p)>=5?$t_p-5:$t_p;
а в корзину все равно при таком подходе товары будут ложится с ценой 133 и т.д. ((((
Алексей, так округляйте цену при записи товара в базу, никаких проблем.
так и делаю. Жаль что нельзя как-то через маску в настройках валюты
Выручили! Единственный сайт где готовое решение есть, а не целый свиток теории и предположений 🙂
хорошее решение спасибо!
Php округлить до большего целого
Возникла вот какая потребность, необходимо округлять целые числа из БД до сотен в большую сторону.
например 2102 в 2200, 4751 в 4800, 614 в 700
Подскажите, есть ли в PHP функция, которая поможет?
P.S.: смотрел функцию ceil, она вроде только по дробным числам..
seo-alex:
P.S.: смотрел функцию ceil, она вроде только по дробным числам..
поделить на 100, округлить, умножить на 100.
Делим целое число на 100, дальше округляем с помощью ceil, потом умножаем на 100. Что то вроде:
С виду работает как надо.
уже ответили, удаляю
тьфу ты, все гениальное просто 🙂 спасибо!
да гениальное действительно просто, но маны читать тоже надо 🙂
Точно. Так как необходимо округление в большую сторону всегда. а не от половины, как делает round 😉
и ТЗ читать видимо тоже надо 🙂
Не тупи, увеличь округляемое на величину чуть меньше половины в зависимости от необходимой точности.
+1. С количеством девяток главное не прогадать 😉
а в твоём случае включить мозги и хотя бы знак перед двойкой не препутать. Да и вообще понять, о чём речь в теме идёт.
floor
(PHP 4, PHP 5, PHP 7, PHP 8)
floor — Округляет дробь в меньшую сторону
Описание
Возвращает ближайшее целое число (как тип float), округляя num в меньшую сторону.
Список параметров
Числовое значение для округления
Возвращаемые значения
Список изменений
Версия | Описание |
---|---|
8.0.0 | num больше не принимает внутренние объекты, поддерживающие числовое преобразование. |
Примеры
Пример #1 Пример использования floor()
Смотрите также
User Contributed Notes 18 notes
Floor isn’t trying to give you the number closest to zero, it’s giving you the lowest bounding integer of a float.
In reply to Glen who commented:
Glen
01-Dec-2007 04:22
echo floor ( 1.6 ); // will output «1»
echo floor (- 1.6 ); // will output «-2»
?>
instead use intval (seems to work v5.1.6):
echo intval ( 1.6 ); // will output «1»
echo intval (- 1.6 ); // will output «-1»
?>
A correction to the funcion floor_dec from the user «php is the best».
If the number is 0.05999 it returns 0.59 because the zero at left position is deleted.
I just added a ‘1’ and after the floor or ceil call remove with a substr.
Hope it helps.
function floor_dec($number,$precision = 2,$separator = ‘.’) <
$numberpart=explode($separator,$number);
$numberpart[1]=substr_replace($numberpart[1],$separator,$precision,0);
if($numberpart[0]>=0) <
$numberpart[1]=substr(floor(‘1’.$numberpart[1]),1);
> else <
$numberpart[1]=substr(ceil(‘1’.$numberpart[1]),1);
>
$ceil_number= array($numberpart[0],$numberpart[1]);
return implode($separator,$ceil_number);
>
Have solved a «price problem»:
echo floor ( 1.6 ); // will output «1»
echo floor (- 1.6 ); // will output «-2»
?>
instead use intval (seems to work v5.1.6):
echo intval ( 1.6 ); // will output «1»
echo intval (- 1.6 ); // will output «-1»
?>
Warning: do not use Seppili’s function to floor with decimals. It will lead you to a lot of trouble because of float number precision.
For example floordec(0.29, 2) will result in 0.28.
Here’s a little fix that will help you get around some problems:
Beware of FLOAT weirdness!
Floats have a mind of their own, and what may look like an integer stored in a float isn’t.
Here’s a baffling example of how floor can be tripped up by this:
mathematical functions lack a floating point version of the modulo operation, which returns the difference between the floor() of the argument and the argument itself:
Useful also to reduce an arbitrarily large floating point value into an entropy source, by first transforming this value into a pair using logarithm functions with distinct bases (add 1 if the function can return 0, to avoid floating point errors with logarithms!):
If you’re wanting to round down to the nearest hundred:
Floor decimal numebrs with precision:
function floor_dec($number,$precision,$separator)
<
$numberpart=explode($separator,$number);
$numberpart[1]=substr_replace($numberpart[1],$separator,$precision,0);
if($numberpart[0]>=0)
<$numberpart[1]=floor($numberpart[1]);>
else
$ceil_number= array($numberpart[0],$numberpart[1]);
return implode($separator,$ceil_number);
>
echo floor_dec(1.125,2,».»); //1.12
echo floor_dec(-1.3436,3,».»); //-1.344
echo floor_dec(102938.1,4,».»); //102938.1
For calculating the number of days, hours, minutes and seconds to an event.
Note that the use of floor may (intended or not) uncover false integers:
?>
The directly retrieved cubic root of 64 (by pow with a fraction exp) equals 4; an outcome any maths teacher will reckon correct.
It is pivotal to check whether you are dealing with genuine integers or floats in disguise. floor should be used carefully.
If you want to ceil decimal, DO NOT USE
function floordec($zahl,$decimals=2) <
return floor($zahl*pow(10,$decimals))/pow(10,$decimals);
>
if you call it floordec(0.58, 2) it return 0.57.
[USE below instead,both work fun]
You can simply make a floor with decimals function by using the round() function and subtract 0.05 to the value if the value must have 1 decimal accuracy, or 0.005 for 2 decimals accuracy, or 0.0005 for 3 decimals etc.
floor basically truncates, or chops off everything to the right of a decimal. For instance, if you have a length of 5.1234, but just wanted the whole number, you could use the following code:
Now, although there is a specific function in PHP for rounding, rounding can also be performed with the floor function. Let’s say we wanted to round the length to the hundredths place.
We can also round to other values, such as the thousandths, by adjusting the code as follows:
Округление до ближайшего кратного пяти в PHP
Я хочу функцию php, которая возвращает 55 при вызове с 52.
Я пробовал round() функция:
возвращает 90 но я хочу!—7—>95.
11 ответов
Это может быть достигнуто несколькими способами, в зависимости от ваших предпочтений округления:
1. Раунд далее кратно 5, исключить текущее число
поведение: 50 выходов 55, 52 выхода 55
2. Раунд ближайший кратно 5, Включите текущее число
поведение: 50 выходов 50, 52 выхода 55, 50.25 выходов 50
3. Округлить до целого числа, а затем до ближайшего кратного 5
поведение: 50 выходов 50, 52 выхода 55, 50.25 выходов 55
округлить до ближайшего (вверх или вниз):
Я знаю, что это старый вопрос, но ИМХО с помощью оператора модуля-лучший способ и гораздо более элегантный, чем принятый ответ.
попробуйте эту маленькую функцию, которую я написал.
Я просто написал эту функцию за 20 минут, основываясь на многих результатах, которые я нашел здесь и там, я не знаю, почему это работает или как это работает!! : D
меня в основном интересовало преобразование номеров валют из этого 151431.1 LBP в 150000.0 LBP. (151431.1 LBP ==
100 USD) который отлично работает до сих пор, однако я попытался сделать его каким-то образом совместимым с другими валютами и номерами, но не уверен, что он работает нормально!!
Не стесняйтесь изменять его и исправлять это если что-то не так