Основы работы с числами в PHP: от int до float

Раздел: Основы программирования на PHP -> Типы данных в PHP

Числовые типы: int и float

PHP предлагает два основных числовых типа: целые числа (int) и числа с плавающей точкой (float). Понимание их особенностей помогает избежать типичных ошибок, связанных с переполнением, потерей точности и неожиданными преобразованиями.

Как правильно работать с целыми и дробными числами, чтобы гарантировать предсказуемое поведение?

Основное эффективное решение - всегда явно задавать тип числа через приведение или проверять его перед использованием. Целое число записывается без десятичной точки, а дробное - с точкой (например, 42 и 3.14). PHP автоматически выбирает тип при присваивании, но при вычислениях тип может меняться. Для финансовых расчётов лучше использовать целые числа (копейки) или расширение BC Math.

$int = 42;
$float = 3.14;
echo $int + $float; // 45.14 - float

Php 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, 10

Of 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().

- Php type int (тип int в php)
- Php 7 types (типы данных в php 7)
- Php return types (типы возвращаемых значений в php)

Расширенные примеры работы с числами

Как использовать большие целые числа за пределами 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.99
50
50
49.99

Пояснение: round() использует стандартное округление (половина вверх). Для финансов часто применяют floor() при усечении цены.


Как форматировать число с разделителями тысяч и дробной частью?

Функция number_format() принимает до четырёх параметров: количество знаков после запятой, десятичный разделитель, разделитель тысяч.

Пример
echo number_format(1234567.891, 2, ',', ' ');
// 1 234 567,89
1 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)); // true
bool(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);     // 26
26
26

Пояснение: Удобно при разборе входных данных, где число может быть представлено в разных системах счисления.

Числовые типы в PHP - comments

En
Php number type (php)