php round half down
Округление чисел в PHP
Округление числа в любом языке программирования может быть выполнено до целого числа или до заданного количества знаков после запятой. Кроме того, учитывается еще, в какую сторону округляется число – к большему или меньшему значению, а так же математически в ближайшую сторону.
В PHP для округления чисел применяются следующие функции:
— round – округление до ближайшего значения;
— ceil – округление до ближайшего значения в большую сторону;
— floor – округление до ближайшего значения в меньшую сторону.
Округление до целого числа
Все функции в качестве основного параметра используют значение с плавающей точкой. Например:
При выполнении каждой функции, получим следующие значения:
При математическом округлении, учитывается значение числа округляемой части. Если оно меньше 5, округляется к меньшему. Если равно или больше 5, округление будет выполнено в большую сторону. В данном случае функция round округляет к меньшему значению, т.к. значение дробной части меньше 0.5. Если использовать значение больше, например:
В результате округления, получим:
Округление числа до заданного количества знаков после запятой
Для такого округления чисел используется только функция round, имеющая второй (не обязательный) параметр, определяющий точность округления. Задав его можно получить необходимое количество знаков после запятой:
Другие примеры округления
Если вдруг потребовалось реализовать более экзотическое округление – к большему или меньшему значению с заданным количеством знаков после запятой, потребуются дополнительные операции. Как было сказано выше, функции ceil и floor имеют только один параметр и не смогут округлить число до заданной точности.
В таких случаях можно выполнить умножение числа, чтобы затем округлить нужным способом. Например, число нужно округлить до большего значения с двумя знаками после запятой:
В результате получим 123.84, хотя аналогичное округление функцией round> в данном случае вернуло бы 123.83.
Так же можно поступить, если нужно округлить до меньшего значения с заданной точностью:
Очень часто в разработке интернет-магазина надо округлять цены в большую или меньшую сторону. Предлагаю рассмотреть функции, которые помогут вам решить проблемы с округлением чисел.
Стандартные функции PHP
Язык программирования PHP имеет 3 основных функции округления:
echo round(5.1); // 5
echo round(5.5); // 6
echo ceil(5.1); // 6
echo ceil(7.5); // 8
echo floor(4.3); // 4
echo floor(6.9); // 6
Однако часто бывает, что стандартных функций не хватает и приходится придумывать различные конструкции для решения нетиповых задач округления.
Округление числа до сотых
Например, если необходимо округлить число 12.5658 до сотых в большую сторону, может пригодится такая конструкция:
$x = 12.5658
echo ceil($x * 100) / 100; // 12.57
То же самое, только с floor(), если надо округлить в меньшую сторону:
$x = 12.5658
echo floor($x * 100) / 100; // 12.56
С функцией round() все немного проще. Для нее можно указать точность округления:
echo round(12.5658, 2); // 12.57
Округление с коэффициентом
А вот хитрое решение, если надо округлить любой число до какого-нибудь кратного числа. Например, стоит задача округлять цены в интернет-магазине до 50-ти. Т.е. число 120 округлить до 150, а 1210 округлить до 1250 и т.д.
Для решения пододбной задачи я предлагаю воспользоваться функцией:
Вот так используя такой набор функций можно округлять числа без проблем!
round
(PHP 4, PHP 5, PHP 7, PHP 8)
round — Округляет число типа float
Описание
Возвращает округлённое значение num с указанной точностью precision (количество цифр после запятой). precision может быть отрицательным или нулём (по умолчанию).
Список параметров
Значение для округления.
Количество десятичных знаков, до которых производится округление
Если precision положительный, num округляется до точности precision цифр после запятой.
Возвращаемые значения
Список изменений
Версия | Описание |
---|---|
8.0.0 | num больше не принимает внутренние объекты, поддерживающие числовое преобразование. |
Примеры
Пример #1 Пример использования round()
Результат выполнения данного примера:
Пример #2 Как параметр precision влияет на числа с плавающей точкой
Результат выполнения данного примера:
Пример #3 Примеры использования параметра mode
Результат выполнения данного примера:
Пример #4 Примеры использования параметра mode с указанием точности precision
Результат выполнения данного примера:
Смотрите также
User Contributed Notes 32 notes
In my opinion this function lacks two flags:
In accounting, it’s often necessary to always round up, or down to a precision of thousandths.
I approach it using round function inside the number_format function:
If you have negative zero and you need return positive number simple add +0:
I discovered that under some conditions you can get rounding errors with round when converting the number to a string afterwards.
To fix this I swapped round() for number_format().
essentially I had round(0.688888889,2);
which would stay as 0.68888889 when printed as a string.
But using number_format it correctly became 0.69.
Okay, final version of my function:
It can be useful in come cases when built-in function like round() or number_format() returns unexpected results. Works with positive and negative numbers, zero, numbers like 1/12, 0.3, numbers in scientific notation etc.
ЗАОСТРИМ НА ОКРУГЛЕНИИ
По итогам некоторой работы решил наваять небольшую статью по поводу разных методов округлений и их реализаций в PHP, Excel, OpenOffice. Думаю, эта информация может пригодиться кому-то еще 🙂
Методы округления в Excel, PHP и не только
При решении задач мат.моделирования и автоматизации бизнес-процессов очень часто возникают погрешности результата, связанные с неочевидностью выбора способов округления, используемых при написании кода.
Так, заказчик почти никогда не может явно сформулировать требования к применяемым в расчетах способам округления, и, зачастую, просто использует расчет, выполненный в Excel-е, как эталон, не задумываясь, как именно и почему именно так происходит округление в том или ином случае.
В такой ситуации полезно:
В данной статье мы расскажем о стандартных способах округления, проанализируем пакет MS Excel 2003, пакет OpenOffice Calc 2.3.0 и язык PHP на предмет имеющихся в них функций округления и их соответствия стандартным. Попутно будут предложены примеры реализаций недостающих функций.
Стандарт IEEE 754 описывает семь методов округления чисел:
Первые пять методов являются, согласно стандарту, обязательными к реализации, а последние два — опциональными.
Тестовая выборка, однозначно различающая методы
Для определения соответствия функции, реализующей округление, некоторому стандартному методу округления удобно воспользоваться специальной тестовой выборкой чисел. Предлагаемый набор из 4 чисел позволяет однозначно различить перечисленные в стандарте семь методов округления.
Рассмотрим следующую таблицу (в предположении, что округления производились до 1 знака после запятой):
Не будем проводить доказательства того, что набор из 4 чисел является минимальным для решения задачи различения методов, покажем лишь, что в данном конкретном наборе нельзя удалить ни одно из чисел:
Отметим, что данный набор чисел не может использоваться для доказательства корректности той или иной функции округления, а только для определения её типа и только в том случае, если заранее известно, что функция реализует один из 7 вышеописанных методов округления.
Анализ существующих функций округления в MS Excel 2003
Изучение и понимание отличий функций округления, доступных в MS Excel, представляется нам важной задачей, т.к. большинство расчетных прототипов, входящих в ТЗ на задачи автоматизации и моделирования, реализуются именно средствами MS Office. При этом важно понимать, что проверка корректности выполнения ТЗ обычно производится путем сверки результатов с результатами прототипа. Таким образом, умение воспроизводить результаты работы методов округления, используемых в каждом конкретном случае, является необходимыми для получения адекватных расчетных результатов.
Анализ справочника функций MS Office Excel 2003 позволяет составить следующий список стандартных функций, реализующих различные виды округления: ОКРУГЛ, ОКРВВЕРХ, ОКРВНИЗ, ОКРУГЛВВЕРХ, ОКРУГЛВНИЗ, ОТБР, ЦЕЛОЕ.
Таким образом, получаем следующие различные наборы функций:
Следовательно, пользователям MS Excel доступны 4 из 7 рассматриваемых методов округления:
Реализация недостающих методов округления в MS Excel 2003
Для реализации недостающих методов округления нам потребуется математическая функция sgn (signum). В языке формул MS Excel она реализована функцией ЗНАК.
Итак, опишем на псевдокоде, близком к языку формул MS Excel, формулы, позволяющие получить желаемые методы округления.
Данные формулы не являются единственным или наилучшим способом реализации указанных методов округления, а являются лишь иллюстрацией возможности их реализации через имеющиеся стандартные методы MS Excel.
Сравнение округлений в OpenOffice Calc 2.3.0 и в MS Excel 2003
Изучение справочника функций языка формул OpenOffice Calc позволило составить такой список функций округления: TRUNC, ROUND, ROUNDDOWN, ROUNDUP, CEILING, FLOOR, MROUND, INT. При этом функции CEILING и FLOOR имеют 2 режима, один из которых (mode=1) декларирован как режим совместимости с MS Excel.
Таким образом, OpenOffice Calc содержит больше различных функций округления, а именно функции CEILI NG и FLOOR, реализующие в режиме (mode=0) методы round_ceiling и round_floor, соответственно.
Анализ существующих функций округления в PHP
Спецификация языка PHP предлагает 4 способа округления чисел: intval, round, floor, ceil. Существуют также менее очевидные способы округления чисел в PHP путем форматирования числа в строку и преобразования его обратно в число. Для такого форматирования могут использоваться стандартные php-функции number_format и sprintf.
Поскольку функции ceil, floor и intval не позволяют указывать требуемую точность округления, для них были написаны обертки (соответственно, p_ceil, p_floor и p_intval).
Таким образом, получаем следующие различные наборы функций:
Следовательно, разработчикам на PHP доступно 4 из 7 рассматриваемых методов округления:
Кроме того, intval (и как следствие, p_intval) имеет сильные ограничения на размер значения аргумента — максимальное допустимое значение аргумента intval равно MAXINT (точное значение зависит от системы). По этой причине не рекомендуется использовать функцию intval для реализации округлений при решении расчетных задач.
Реализация недостающих методов округления в PHP
Как указывалось выше, для нормального использования функций floor и ceil потребовалось реализовать функции-обертки, позволяющие указывать точность округления (количество знаков после запятой).
Кроме того, в PHP отсутствует реализация математической функции sgn. Нам потребуется своя:
Т еперь, имея p_ceil, p_floor и round (как реализации, соответственно, round_ceiling, round_floor и round_half_up) и собственную реализацию sgn, мы можем воспроизвести недостающие методы округления следующим образом:
Данный код не является единственным или наилучшим способом реализации указанных методов округления, а являются лишь иллюстрацией возможности их реализации через имеющиеся стандартные функции PHP.
Функция PHP round — округляем быстро и просто
В этой статье мы рассмотрим PHP-функцию, с помощью которой можно выполнять такую математическую операцию, как округление числа. Также читатель узнает о нескольких режимах работы данной функции и возможных способах ее реализации. Для наилучшего понимания теория будет сопровождаться практическими примерами.
Прежде чем продолжить, следует сказать, что в языке PHP предусмотрены три типа округления целого и дробного числа (в большую сторону, в меньшую сторону, а также по стандартному математическому правилу). Начнём с третьего типа. Здесь round() округляет значения по правилу, которое все проходили в школе. Давайте его вспомним: 1) если цифра, подлежащая округлению, находится в пределах 0-4, то цифра разряда, до которого осуществляется округление, не изменяется, а оставшиеся числа заменяются нулями; 2) если цифра, подлежащая округлению, находится в пределах 5-9, то цифра разряда, до которого осуществляется округление, повышается на единицу, а оставшиеся числа тоже заменяются нулями.
Исходя из вышесказанного, рассмотрим несколько практических примеров:
В результате работы этого кода на экран будет выведено целое число 5.
Идём дальше. Следующий пример выведет уже целое число 6, что отвечает правилу, написанному выше:
Также можно определить, до какого именно числа округлять значения. Для этого следует указать не только число, но и количество знаков, находящихся до запятой (количество знаков (символов), находящихся после запятой). Общий синтаксис предельно прост:
Рассмотрим на примере:
Вы можете проверить работу этого кода самостоятельно, используя простейший онлайн-компилятор.
Округляем в большую/меньшую сторону
Осталось рассмотреть, как округлять цифры в меньшую или большую сторону. Сделать это тоже несложно, но потребуется дополнительный третий параметр, называемый mode. Этот параметр нужен для передачи соответствующей константы. Речь идёт о специальных зарезервированных в языке константах, которые перечислены ниже: • PHP_ROUND_HALF_UP — используется, если надо округлить в большую сторону; • PHP_ROUND_HALF_DOWN — используется, если надо округлить в меньшую сторону.
Обязательно рассмотрим практические примеры работы констант:
Это предельно простые операции, освоить которые не составит труда. Если же хотите получить действительно продвинутые знания по PHP-разработке, добро пожаловать на специализированный курс в OTUS!
Источники: • http://code.mu/ru/php/manual/math/round/; • https://learn.javascript.ru/number; • https://tutomath.ru/5-klass/okruglenie-naturalnyh-chisel.html.
И не забывайте оставлять свои комментарии!