Position actuelle: Accueil> Derniers articles> Pourquoi est_double (1) renvoie faux? Comprendre la vérification du type

Pourquoi est_double (1) renvoie faux? Comprendre la vérification du type

gitbox 2025-05-27

Introduction au système de type PHP

Pour comprendre ce comportement, nous devons d'abord comprendre le système de type PHP. PHP est un langage faiblement typé qui convertit automatiquement dans la plupart des cas. Cependant, PHP maintient toujours des types de données claires en interne:

  • Entier

  • Type de flotteur (double / flotteur)

  • chaîne

  • Booléen

  • Tableau

  • Objet

  • Ressource

  • NUL

Cela signifie que même si 1 et 1,0 sont numériques, ils sont toujours différents de type.


Comment fonctionne IS_DOUBLE?

Is_double () est une fonction intégrée en PHP qui détecte si une variable est de type de point flottant. La logique d'implémentation est en fait très simple, ce qui équivaut à vérifier si l'identifiant de type de la variable en mémoire est "point flottant".

Jetons un coup d'œil à un exemple:

 $a = 1;
$b = 1.0;

var_dump(is_double($a)); // bool(false)
var_dump(is_double($b)); // bool(true)

Dans le code ci-dessus, la variable $ a est un entier, qui est strictement identifié comme un "entier" en PHP, et $ b est un numéro de point flottant, qui reviendra vrai .

Cela explique le problème dans le titre de l'article: Is_double (1) Renvoie False car le littéral 1 est un entier, pas un type de point flottant.


Quel sera le retour is_double ('1.0') ?

Vous pouvez également vous demander comment is_double () se comportera lorsque vous passez dans une chaîne qui ressemble à un numéro de point flottant:

 var_dump(is_double('1.0')); // bool(false)

Ce résultat montre à nouveau que is_double () n'effectue pas de conversion de type implicite. La chaîne «1.0» n'est pas automatiquement interprétée comme un numéro de point flottant. IS_DOUBLE () ne renverra True que si le type interne de la variable est déjà flottant.


La bonne façon de faire la conversion de type

Si votre objectif est de déterminer si une valeur peut être interprétée comme un numéro de point flottant, et non seulement de compter sur is_double () , vous devez taper explicitement la conversion ou utiliser une vérification d'expression régulière. Par exemple:

 function is_numeric_float($value) {
    return is_numeric($value) && (strpos((string)$value, '.') !== false);
}

var_dump(is_numeric_float('1.0')); // bool(true)

Alternativement, vous pouvez utiliser filter_var () pour une vérification plus flexible:

 var_dump(filter_var('1.0', FILTER_VALIDATE_FLOAT)); // float(1)

Ce type de méthode est plus fiable dans le développement réel que simplement en s'appuyant sur is_double () , en particulier lors du traitement des données dans les demandes d'entrée ou de réseau utilisateur.


Pièges dans des applications pratiques

Dans certains scénarios de vérification des données, les développeurs peuvent supposer à tort que is_double () peut juger de toutes les valeurs qui "ressemblent à un numéro de point flottant". Par exemple, si vous recevez une demande JSON à l'avant, la valeur du champ est "1.0" . Si vous utilisez is_double () pour vérifier directement, il sera mal jugé que le format de données soit incorrect.

La bonne façon est de combiner is_numeric () avec la vérification du format, ou de convertir manuellement les types de champs lors de l'analyse de JSON:

 $data = json_decode(file_get_contents('https://gitbox.net/data.json'), true);
$price = (float)$data['price'];
if (is_double($price)) {
    // Utilisation sûre des numéros de points flottants
}