Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Числа и математика

Цены, проценты, рейтинги, размеры — почти в любой программе есть вычисления. В 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;             // 2

ceil() пригождается при разбиении на страницы: 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);              // 9

max() и 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)

Сравнивайте дроби с допуском или после округления. Деньги надёжнее хранить целым числом копеек.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.