is_finite()
Découvrez la fonction is_finite() en PHP, utilisée pour déterminer si une valeur est un nombre fini.
La fonction is_finite() en PHP vous indique si un nombre est fini — c'est-à-dire un nombre ordinaire qui n'est ni infini (INF / -INF) ni NAN (Not a Number). Cette page explique ce qui est considéré comme fini, comment la fonction gère les valeurs non numériques, et quand l'utiliser dans du code réel.
Syntaxe
is_finite(float $num): bool$num— la valeur à tester. Elle est traitée comme unfloat; les chaînes numériques et les entiers sont convertis automatiquement.- Valeur de retour —
truesi$numest un nombre fini,falses'il vautINF,-INFouNAN.
Pourquoi le concept de « fini » est important
L'arithmétique en virgule flottante peut produire des valeurs spéciales qui ne sont pas des nombres ordinaires :
INFet-INFapparaissent lorsqu'un résultat dépasse la plage d'unfloat(par exemple en divisant par zéro avec des flottants, ou avecPHP_FLOAT_MAX * 2).NANapparaît pour des opérations indéfinies telles quesqrt(-1)ouINF - INF.
Ces valeurs se propagent silencieusement dans les calculs ultérieurs et faussent les comparaisons (NAN == NAN vaut même false). is_finite() vous permet de les détecter avant qu'elles ne corrompent votre sortie.
Exemple de base
Ce code affecte un nombre ordinaire à une variable et affiche The number is a finite number, car 10 est fini.
Comportement selon les valeurs
L'exemple ci-dessous montre ce que is_finite() retourne pour les cas limites courants :
<?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
?>Notez que is_finite() ne vérifie pas qu'une valeur est numérique — elle effectue d'abord une conversion. is_finite("hello") devient is_finite(0.0) et retourne true. Si vous devez confirmer qu'une valeur est réellement un nombre, validez-la d'abord avec is_numeric().
Cas d'utilisation pratique
Un schéma courant consiste à protéger un calcul susceptible de déborder vers 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
?>Ici, safeSquare() retourne null au lieu de laisser INF se propager dans le reste du programme, ce qui permet à l'appelant de gérer l'échec proprement. (Notez qu'en PHP 8+, la division d'un entier ou d'un flottant par zéro lève une DivisionByZeroError plutôt que de produire INF, donc le débordement est la façon habituelle d'obtenir un résultat infini.)
Fonctions associées
is_infinite()— la vérification inverse : retournetruepourINF/-INF.is_nan()— teste spécifiquementNAN.is_numeric()— vérifie si une valeur est un nombre ou une chaîne numérique avant d'effectuer des calculs.is_float()— vérifie si le type d'une variable estfloat.
Conclusion
is_finite() est une protection modeste mais importante lorsque vous travaillez avec des calculs en virgule flottante en PHP. Elle retourne true uniquement pour les nombres ordinaires et false pour INF, -INF et NAN, vous permettant de détecter les débordements et les résultats indéfinis avant qu'ils ne se propagent. Combinez-la avec is_numeric() pour la validation des entrées, et avec is_infinite() / is_nan() lorsque vous devez savoir exactement quelle valeur spéciale a été rencontrée.