Dans le développement de PHP, vous rencontrez souvent ce doute: les résultats obtenus en utilisant la fonction ceil () semblent incompatibles avec le décodage des résultats après avoir été sérialisé par json_encode () . Pourquoi ce phénomène se produit-il? Cet article analysera les raisons du point de vue de la représentation numérique sous-jacente, du mécanisme de codage JSON, etc., et donnera des exemples correspondants.
La fonction CEIL () est utilisée pour s'arrondir et renvoie la valeur entière minimale pas moins que le paramètre. Son type de valeur de retour est un flotteur, et même si le résultat est un entier, la valeur de retour est toujours un type de point flottant.
<?php
$num = 4.2;
$result = ceil($num);
var_dump($result); // float(5)
?>
Comme vous pouvez le voir, Ceil () renvoie un numéro de point flottant 5.0 , plutôt qu'un entier 5 .
Les nombres à virgule flottante en PHP sont basés sur la norme à double précision IEEE 754 et représentent un nombre en binaire 64 bits. Les points flottants ne peuvent pas représenter avec précision toutes les décimales décimales, et il y a une erreur de précision.
Il en résulte que même si le résultat de ceil () est théoriquement un entier, comme 5.0 , il peut y avoir de très petites erreurs dans le stockage binaire sous-jacent.
JSON_ENCODE () convertit les numéros de points flottants de PHP vers les types numériques JSON. JSON lui-même ne fait pas de distinction entre les entiers et les nombres à virgule flottante, seulement les types numériques.
Par exemple:
<?php
$num = ceil(4.2);
$json = json_encode($num);
echo $json; // Sortir "5"
?>
Bien que $ num soit un point de point flottant 5.0 en PHP, il est représenté comme un numéro 5 en JSON, et le point décimal et la partie décimale sont supprimés.
Lorsque vous analysez une chaîne JSON à l'aide de JSON_DECODE () , le numéro sera converti en numéros de points ou entiers flottants par défaut, selon la représentation de la chaîne JSON.
<?php
$json = json_encode(ceil(4.2)); // "5"
$decoded = json_decode($json);
var_dump($decoded); // int(5)
?>
Ici, JSON_DECODE () convertit 5 en JSON en un entier Int (5) , qui est différent du flotteur flottant (5) dans le PHP d'origine.
Pour résumer:
Le retour de ceil () est toujours un numéro de point flottant.
La sortie du formulaire numérique par JSON_ENCODE () supprime la partie de point décimal.
JSON_DECODE () le convertit en entiers ou nombres de points flottants basés sur des formulaires numériques.
Par conséquent, Ceil () obtient le numéro de point flottant (5) , qui peut devenir un entier int (5) après sérialisation et décodage JSON.
C'est pourquoi vous voyez différents types de résultats et manifestations des deux.
<?php
$num = 4.2;
$ceilValue = ceil($num);
echo "ceil() résultat:";
var_dump($ceilValue); // float(5)
$json = json_encode($ceilValue);
echo "json_encode() résultat: $json\n"; // "5"
$decoded = json_decode($json);
echo "json_decode() résultat:";
var_dump($decoded); // int(5)
?>
Sortir:
ceil() résultat:float(5)
json_encode() résultat:5
json_decode() résultat:int(5)
Si vous souhaitez conserver la valeur de retour de ceil () comme type entier, vous pouvez lancer le type après utilisation:
$intValue = (int)ceil($num);
Faites attention à la conversion automatique des types numériques après l'analyse JSON. Si nécessaire, vous pouvez activer le deuxième paramètre $ Assoc = TRUE pour convertir JSON en un tableau associatif, qui est plus pratique à gérer.
Comprenez les différences entre les nombres à virgule flottante et les nombres JSON et évitez les erreurs logiques causées par différents types.