Найти в Дзене

Тонкая грань: как опознать и понять природу вещественных чисел в PHP

Динамическая типизация PHP — одновременно и благословение, и проклятие разработчика. Она дарует свободу, но взамен требует глубокого понимания внутренней кухни языка. Сегодня мы поговорим о том, как безошибочно определить, является ли число вещественным (float/double), и разберем тот самый особый случай, когда целое число автоматически становится вещественным, даже если вы этого не просили. PHP предоставляет несколько способов проверки типа, но при работе с числами важно понимать их иерархию. is_float(): ваш главный инструмент Основной и самый надежный способ — функция is_float() (и её псевдоним is_double(), напоминающий о legacy-временах, когда float называли double) . Осторожно: is_numeric() не про тип, а про содержание Новички часто совершают одну и ту же ошибку: путают проверку типа с проверкой "числовости". is_numeric() вернет true и для целого числа, и для вещественного, и даже для строки "3.14". Эта функция проверяет содержимое, а не тип. Существуют и обходные пути. Например, м
Оглавление

Динамическая типизация PHP — одновременно и благословение, и проклятие разработчика. Она дарует свободу, но взамен требует глубокого понимания внутренней кухни языка. Сегодня мы поговорим о том, как безошибочно определить, является ли число вещественным (float/double), и разберем тот самый особый случай, когда целое число автоматически становится вещественным, даже если вы этого не просили.

Анатомия вещественных чисел: как отличить 3 от 3.14

PHP предоставляет несколько способов проверки типа, но при работе с числами важно понимать их иерархию.

is_float(): ваш главный инструмент

Основной и самый надежный способ — функция is_float() (и её псевдоним is_double(), напоминающий о legacy-временах, когда float называли double) .

Осторожно: is_numeric() не про тип, а про содержание

Новички часто совершают одну и ту же ошибку: путают проверку типа с проверкой "числовости". is_numeric() вернет true и для целого числа, и для вещественного, и даже для строки "3.14". Эта функция проверяет содержимое, а не тип.

-2

Альтернативные методы

Существуют и обходные пути. Например, можно использовать gettype() :

-3

Последний способ интересен, но опасен: он не различает типы, он различает наличие дробной части.

Автоматическое преобразование: когда 1 превращается в 1.0

Теперь перейдем к самой интригующей части — автоматическому преобразованию целых чисел в вещественные.

Арифметика: рождение float из целых чисел

Классический сценарий — операция деления:

-4

PHP поступает рационально: если результат операции не может быть точно представлен целым числом, язык автоматически повышает тип до float. Это называется type juggling (жонглирование типами) .

Неочевидное поведение: сложение строки с числом

Другой сценарий — арифметические операции со строкой, содержащей число с плавающей точкой :

$string = '3.14';
$mySum = $string + 5; // float(8.14)

Даже если строка содержит целое число, но в контексте операции ожидается float, PHP может преобразовать всё выражение к float.

Строгая типизация и исключения из правил

PHP 7+ позволяет включить строгую типизацию (declare(strict_types=1);). Однако даже в этом режиме существует осознанное исключение: целое число можно передать туда, где ожидается float.

-5

Это решение разработчиков языка продиктовано практичностью: целые числа являются подмножеством вещественных с математической точки зрения, и запрет на такую передачу создавал бы массу неудобств.

Массивы: невидимое приведение

Еще один интересный случай — использование float в качестве ключа массива:

$arr = [3.5 => "value"];
echo array_key_first($arr); // int(3) — ключ стал целым числом!

Здесь происходит обратное преобразование: float к int, но сам факт того, что число "гуляет" между типами, говорит о гибкости системы.

Подводные камни и советы

  • Не доверяйте внешнему виду. Число 15.00 после математических операций может остаться float, даже если дробная часть нулевая.
  • Используйте intval()/floatval() для явных преобразований. Если вы ждете от пользователя число с плавающей точкой, но готовы принять целое — сделайте явное приведение: $value = floatval($_POST['price']);
  • Помните о settype(). Эта функция изменяет тип исходной переменной:
$num = '3.14';
settype($num, "float"); // $num теперь float(3.14)
  • При сравнении используйте строгое равенство:
if (0 == "0") {} // true (приведение типов)
if (0 === "0") {} // false (разные типы)

Резюме

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

PHP не пытается вас запутать. Он пытается быть гибким. И знание этих "особенностей национальной типизации" превращает код из набора костылей в стройную, предсказуемую систему.

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.