W3docs

is_finite()

Разбираем функцию is_finite() в PHP: что считается конечным числом, как функция обрабатывает нечисловые значения и когда её применять.

Функция is_finite() в PHP проверяет, является ли число конечным — то есть обычным числом, которое не является бесконечностью (INF / -INF) или NAN (не числом). На этой странице объясняется, что считается конечным, как функция обрабатывает нечисловые значения и когда она пригодится в реальном коде.

Синтаксис

is_finite(float $num): bool
  • $num — проверяемое значение. Обрабатывается как float; числовые строки и целые числа преобразуются автоматически.
  • Возвращаемое значениеtrue, если $num является конечным числом; false, если это INF, -INF или NAN.

Почему «конечность» важна

Арифметика с плавающей точкой может порождать специальные значения, которые не являются обычными числами:

  • INF и -INF появляются, когда результат выходит за пределы диапазона float (например, при делении на ноль с числами с плавающей точкой или при PHP_FLOAT_MAX * 2).
  • NAN появляется при неопределённых операциях, таких как sqrt(-1) или INF - INF.

Эти значения незаметно распространяются через последующие вычисления и нарушают сравнения (NAN == NAN даже возвращает false). Функция is_finite() позволяет обнаружить их до того, как они испортят результат.

Простой пример

php— editable, runs on the server

Здесь переменной присваивается обычное число и выводится The number is a finite number, поскольку 10 является конечным числом.

Поведение для разных значений

Пример ниже показывает, что возвращает is_finite() для распространённых граничных случаев:

<?php
var_dump(is_finite(10));               // bool(true)  — a normal integer
var_dump(is_finite(3.14));             // bool(true)  — a normal float
var_dump(is_finite("42"));             // bool(true)  — numeric string is cast to float
var_dump(is_finite(PHP_FLOAT_MAX));    // bool(true)  — large but still finite
var_dump(is_finite(INF));              // bool(false) — positive infinity
var_dump(is_finite(-INF));             // bool(false) — negative infinity
var_dump(is_finite(PHP_FLOAT_MAX * 2));// bool(false) — overflows to INF
var_dump(is_finite(NAN));              // bool(false) — Not a Number
?>

Обратите внимание: is_finite() не проверяет, является ли значение числом — она сначала выполняет приведение типов. is_finite("hello") превращается в is_finite(0.0) и возвращает true. Если нужно убедиться, что значение действительно является числом, сначала проверьте его с помощью is_numeric().

Практический пример

Распространённый паттерн — защита вычисления, которое может переполниться до INF:

<?php
function safeSquare($x) {
  $result = $x * $x;
  // If the multiplication overflows, $result becomes INF.
  return is_finite($result) ? $result : null;
}

var_dump(safeSquare(3.0));            // float(9)
var_dump(safeSquare(PHP_FLOAT_MAX));  // NULL — squaring overflows to INF
?>

Здесь safeSquare() возвращает null вместо того, чтобы позволить INF проникнуть в остальную часть программы, — это даёт вызывающему коду возможность корректно обработать ошибку. (Обратите внимание: в PHP 8+ деление целых или дробных чисел на ноль выбрасывает DivisionByZeroError, а не возвращает INF, поэтому переполнение — типичный способ получить бесконечный результат.)

Связанные функции

  • is_infinite() — обратная проверка: возвращает true для INF / -INF.
  • is_nan() — проверяет конкретно на NAN.
  • is_numeric() — проверяет, является ли значение числом или числовой строкой, перед выполнением математических операций.
  • is_float() — проверяет, имеет ли переменная тип float.

Заключение

is_finite() — небольшая, но важная защита при работе с арифметикой с плавающей точкой в PHP. Она возвращает true только для обычных чисел и false для INF, -INF и NAN, позволяя перехватывать переполнение и неопределённые результаты до их распространения. Используйте её вместе с is_numeric() для валидации входных данных, а также с is_infinite() / is_nan(), когда нужно точно определить, какое специальное значение вы получили.

Практика

Практика
Каково правильное использование функции 'is_finite' в PHP?
Каково правильное использование функции 'is_finite' в PHP?
Was this page helpful?