Основы работы с числами в PHP: от int до float
Числовые типы: int и float
PHP предлагает два основных числовых типа: целые числа (int) и числа с плавающей точкой (float). Понимание их особенностей помогает избежать типичных ошибок, связанных с переполнением, потерей точности и неожиданными преобразованиями.
Как правильно работать с целыми и дробными числами, чтобы гарантировать предсказуемое поведение?
Основное эффективное решение - всегда явно задавать тип числа через приведение или проверять его перед использованием. Целое число записывается без десятичной точки, а дробное - с точкой (например, 42 и 3.14). PHP автоматически выбирает тип при присваивании, но при вычислениях тип может меняться. Для финансовых расчётов лучше использовать целые числа (копейки) или расширение BC Math.
$int = 42;
$float = 3.14;
echo $int + $float; // 45.14 - floatPhp check type (проверка типа переменной в php)
В этом примере сложение целого и дробного даёт дробный результат. Если нужна целая сумма, можно округлить: (int)($int + $float) даст 45.
Как записать число в двоичной, восьмеричной или шестнадцатеричной системе?
PHP позволяет задавать целые числа в разных системах счисления. Двоичные числа начинаются с 0b, восьмеричные - с 0, шестнадцатеричные - с 0x. Это удобно для работы с битовыми масками или цветами.
$binary = 0b1010; // 10
$octal = 012; // 10
$hex = 0xA; // 10
echo $binary, ', ', $octal, ', ', $hex; // 10, 10, 10Of type string is deprecated php (предупреждение об устаревании типа string в php)
Типичная ошибка: случайное использование ведущего нуля в десятичном числе (например, $val = 012) воспринимается как восьмеричное. Это может привести к неожиданному значению. Решение: явно указывать основание или использовать функцию intval() со вторым параметром 10.
Как выполнить преобразование строки в число и обработать возможные ошибки?
PHP автоматически преобразует строку в число, если она начинается с числовых символов. Но это может привести к неявным ошибкам. Явное преобразование через (int) или (float) безопаснее. Для контроля используйте is_numeric() перед преобразованием.
$str = '123abc';
echo (int)$str; // 123 - остаток игнорируется
echo (float)'abc'; // 0 - пустое значениеPhp mime type (mime-типы в php)
Ошибка: если строка содержит нечисловые символы в начале, результатом будет 0. Это сложно отловить. Решение: проверять через ctype_digit() или preg_match().
Как избежать потери точности при работе с дробными числами?
Числа float имеют ограниченную точность (около 14-16 значащих цифр). Сравнение двух float может дать ложный результат. Решение - использовать сравнение с допустимой погрешностью (epsilon) или применять целочисленную арифметику для денежных сумм.
$a = 0.1 + 0.2;
if (abs($a - 0.3) < 1e-10) { echo 'равно'; } // равно
$cents = (0.1 * 100) + (0.2 * 100); // 30
$dollars = $cents / 100; // 0.3 - без потериPhp set type (функция settype() в php)
Проблема: прямое сравнение $a == 0.3 может быть false. Решение: сравнивать с epsilon или использовать round() с нужной точностью.
Как проверить тип переменной и является ли она числом?
Для этого используют функции is_int(), is_float(), is_numeric(). is_numeric() возвращает true для числовых строк (например, '123', '1e5'), но не для строк с пробелами.
$val = '3.14';
var_dump(is_int($val)); // false
var_dump(is_float($val)); // false
var_dump(is_numeric($val)); // trueТипичная ошибка: не различать is_numeric() и is_int(). Первая принимает числовые строки, вторая - только true integer. Для строгой проверки используйте gettype().
Расширенные примеры работы с числами
Как использовать большие целые числа за пределами 64-битного диапазона?
Стандартный int в PHP ограничен платформой (обычно 64 бита). Для чисел больше 9223372036854775807 применяется расширение GMP (GNU Multiple Precision). Пример:
$big = gmp_init('123456789012345678901234567890');
$result = gmp_add($big, '1');
echo gmp_strval($result);123456789012345678901234567891
Пояснение: gmp_init() создаёт GMP-число из строки. Арифметические операции выполняются через функции gmp_add(), gmp_mul() и т.д. Результат преобразуется в строку gmp_strval().
Как округлить число до заданного количества знаков после запятой?
Функция round() округляет до указанного числа десятичных знаков. Также есть ceil() (вверх) и floor() (вниз).
$price = 49.995;
echo round($price, 2); // 50.00
echo ceil($price * 100) / 100; // 50.00
echo floor($price * 100) / 100; // 49.9950 50 49.99
Пояснение: round() использует стандартное округление (половина вверх). Для финансов часто применяют floor() при усечении цены.
Как форматировать число с разделителями тысяч и дробной частью?
Функция number_format() принимает до четырёх параметров: количество знаков после запятой, десятичный разделитель, разделитель тысяч.
echo number_format(1234567.891, 2, ',', ' ');
// 1 234 567,891 234 567,89
Пояснение: Первый параметр - число, второй - число десятичных знаков, третий - символ для десятичной точки, четвёртый - разделитель тысяч.
Как проверить специальные значения float: NaN и Infinity?
PHP предоставляет константы NAN и INF. Функции is_nan() и is_infinite() позволяют их обнаружить.
$val = log(0); // -INF
var_dump(is_infinite($val)); // true
$nan = acos(2); // NAN
var_dump(is_nan($nan)); // truebool(true) bool(true)
Пояснение: NaN не равен самому себе ( $nan == NAN false), поэтому необходима специальная проверка.
Как выполнять побитовые операции с целыми числами?
Побитовые операторы (&, |, ^, ~, <<, >>) работают только с целыми числами. Полезны для флагов.
$flags = 0b0011; // 3
$mask = 0b0100; // 4
if ($flags & $mask) { echo 'бит 2 установлен'; }
$result = $flags | $mask; // 0b0111 = 7
echo $result;7
Пояснение: Побитовое И & проверяет, установлены ли биты маски. Побитовое ИЛИ | объединяет биты.
Как преобразовать число из строки с явным указанием основания?
Функция intval() принимает второй параметр - основание (от 2 до 36). Аналог для hex - hexdec().
$hex = '1A';
echo intval($hex, 16); // 26
echo hexdec($hex); // 2626 26
Пояснение: Удобно при разборе входных данных, где число может быть представлено в разных системах счисления.