In der PHP -Entwicklung begegnen Sie häufig diesen Zweifel: Die Ergebnisse, die mit der Funktion von CEIL () erzielt wurden, sehen sich mit den Ergebnissen, die nach der Serialisierung von JSON_Encode () , nicht mit den Ergebnissen dekodiert werden. Warum tritt dieses Phänomen auf? Dieser Artikel wird die Gründe aus den Perspektiven der zugrunde liegenden numerischen Darstellung, dem JSON -Codierungsmechanismus usw. analysieren und entsprechende Beispiele geben.
Die CEIL () -Funktion wird verwendet, um nach oben abzurunden und gibt den minimalen Ganzzahlwert nicht weniger als der Parameter zurück. Sein Rückgabewerttyp ist ein Float, und selbst wenn das Ergebnis eine Ganzzahl ist, ist der Rückgabewert immer noch ein schwimmender Punkttyp.
<?php
$num = 4.2;
$result = ceil($num);
var_dump($result); // float(5)
?>
Wie Sie sehen können, gibt Ceil () eher eine schwimmende Punktzahl 5.0 als eine Ganzzahl 5 zurück.
Die Gleitkomma-Zahlen in PHP basieren auf dem IEEE 754 Doppel-Präzisionsstandard und stellen eine Zahl in 64-Bit-Binärdatoren dar. Schwimmpunkte können nicht alle Dezimal -Dezimalstellen genau darstellen, und es gibt Genauigkeitsfehler.
Dies führt dazu, dass selbst wenn das Ergebnis von CEIL () theoretisch eine Ganzzahl ist, z .
JSON_ENCODE () konvertiert die schwimmenden Punktnummern von PHP in JSON -Numerik -Typen. JSON selbst unterscheidet nicht zwischen Ganzzahlen und Gleitkomma-Zahlen, nur numerischen Typen.
Zum Beispiel:
<?php
$num = ceil(4.2);
$json = json_encode($num);
echo $json; // Ausgabe "5"
?>
Obwohl $ num eine schwimmende Punktzahl 5.0 in PHP ist, wird es in JSON als Nummer 5 dargestellt, und der Dezimalpunkt und der Dezimalteil werden entfernt.
Wenn Sie einen JSON -String mit json_decode () analysieren, wird die Nummer je nach Darstellung der JSON -Zeichenfolge standardmäßig in schwimmende Punktnummern oder Ganzzahlen konvertiert.
<?php
$json = json_encode(ceil(4.2)); // "5"
$decoded = json_decode($json);
var_dump($decoded); // int(5)
?>
Hier konvertiert JSON_DECODE () 5 in JSON in eine Ganzzahl int (5) , die sich vom Gleitkomma -Schwimmer (5) im ursprünglichen PHP unterscheidet.
Um zusammenzufassen:
Die Rückgabe von CEIL () ist immer eine schwimmende Punktzahl.
Das Zahlenformularausgabe von JSON_Encode () entfernt den Dezimalpunktteil.
JSON_DECODE () konvertiert es in Ganzzahlen oder schwimmenden Punktnummern basierend auf numerischen Formen.
Daher erhält CEIL () den schwimmenden Punktzahl float (5) , der nach JSON -Serialisierung und -Decodierung zu einer Ganzzahl int (5) werden kann.
Aus diesem Grund sehen Sie verschiedene Ergebnissetypen und Manifestationen der beiden.
<?php
$num = 4.2;
$ceilValue = ceil($num);
echo "ceil() Ergebnis:";
var_dump($ceilValue); // float(5)
$json = json_encode($ceilValue);
echo "json_encode() Ergebnis: $json\n"; // "5"
$decoded = json_decode($json);
echo "json_decode() Ergebnis:";
var_dump($decoded); // int(5)
?>
Ausgabe:
ceil() Ergebnis:float(5)
json_encode() Ergebnis:5
json_decode() Ergebnis:int(5)
Wenn Sie den Rückgabewert von CEIL () als Ganzzahltyp beibehalten möchten, können Sie den Typ nach der Verwendung aufgeben:
$intValue = (int)ceil($num);
Achten Sie auf die automatische Umwandlung numerischer Typen nach JSON -Parsen. Bei Bedarf können Sie den zweiten Parameter $ assoc = treu einschalten, um JSON in ein assoziatives Array umzuwandeln, das bequemer zu handhaben ist.
Verstehen Sie die Unterschiede zwischen Gleitpunktzahlen und JSON-Zahlen und vermeiden Sie logische Fehler, die durch verschiedene Typen verursacht werden.