Числа и математика
Цены, проценты, рейтинги, размеры — почти в любой программе есть вычисления. В PHP для них есть набор готовых функций.
Округление
round() округляет до ближайшего значения. Второй аргумент — число знаков после запятой:
<?php
echo round(4.6), "\n"; // 5
echo round(3.14159, 2), "\n"; // 3.14
echo round(1250, -2); // 1300Отрицательная точность округляет до десятков и сотен.
Вверх и вниз
floor() округляет вниз, ceil() — вверх. intdiv() делит нацело:
<?php
echo floor(4.7), "\n"; // 4
echo ceil(4.2), "\n"; // 5
echo intdiv(17, 5), "\n"; // 3
echo 17 % 5; // 2ceil() пригождается при разбиении на страницы: ceil(45 / 10) даёт пять страниц для 45 записей.
Наибольшее, наименьшее, модуль
<?php
echo max(3, 9, 5), "\n"; // 9
echo min([3, 9, 5]), "\n"; // 3
echo abs(-7), "\n"; // 7
echo 2 ** 10, "\n"; // 1024
echo sqrt(81); // 9max() и min() принимают и отдельные числа, и массив.
Форматирование
number_format() превращает число в строку для показа пользователю: задаёт число знаков, знак дроби и разделитель тысяч:
<?php
echo number_format(1234567.891), "\n"; // 1,234,568
echo number_format(1234567.891, 2), "\n"; // 1,234,567.89
echo number_format(1234567.891, 2, ',', ' '); // 1 234 567,89Результат — строка. Считать с ней дальше нельзя, поэтому форматируйте число в самом конце, при выводе.
Случайные числа
random_int() возвращает случайное целое в заданных границах, включая обе:
<?php
$dice = random_int(1, 6);
echo $dice >= 1 && $dice <= 6 ? 'Бросок выполнен' : 'Ошибка';random_int() подходит и для паролей, и для кодов подтверждения. Случайный элемент массива даёт array_rand(), а shuffle() перемешивает массив.
Проверка, что значение — число
Данные из формы приходят строками. is_numeric() проверяет, похожа ли строка на число:
<?php
var_dump(is_numeric('42')); // bool(true)
var_dump(is_numeric('4.5')); // bool(true)
var_dump(is_numeric('4 кг')); // bool(false)Частая ошибка
Дробные числа хранятся в двоичном виде и не всегда точны. Сумма 0.1 + 0.2 на крошечную долю отличается от 0.3, поэтому сравнение через == даёт false:
<?php
var_dump(0.1 + 0.2 == 0.3); // bool(false)
var_dump(abs(0.1 + 0.2 - 0.3) < 0.00001); // bool(true)
var_dump(round(0.1 + 0.2, 2) == 0.3); // bool(true)Сравнивайте дроби с допуском или после округления. Деньги надёжнее хранить целым числом копеек.