Position actuelle: Accueil> Derniers articles> Pourquoi les résultats de la sérialisation CEIL () et JSON sont-ils différents?

Pourquoi les résultats de la sérialisation CEIL () et JSON sont-ils différents?

M66 2025-06-02

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.

1. La fonction et la valeur de retour de la fonction ceil ()

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 .

2. Problèmes de représentation binaire et de précision des numéros de points flottants

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.

3. Traitement des nombres de points flottants pendant la sérialisation JSON

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.

4. Le type change après l'analyse JSON

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.

5. La cause profonde de différents résultats

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.

6. Exemple de démonstration de code

 <?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)

7. Solutions et suggestions

  • 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.