Der im JSON -Format verwendete Zahlentyp ist der Zahlentyp basierend auf JavaScript, der bestimmte Genauigkeitsbeschränkungen aufweist. Der Zahlentyp von JavaScript basiert auf dem IEEE 754 Doppel-Präzisions-Schwimmpunkt-Nummernstandard (64 Bit), und die maximale Genauigkeit, die dargestellt werden kann, beträgt 15 bis 17-Bit erhebliche Zahlen. Wenn JSON -Daten Zahlen enthalten, die diesen Präzisionsbereich überschreiten, kann die Präzision während des Konversionsprozesses verloren gehen.
In PHP spricht JSON_DECODE Zahlen in JSON in einen schwimmenden Typ ( Float ) an, der auch auf dem IEEE 754 -Standard basiert. Dieser Typ unterscheidet sich in der Präzision von JavaScripts Zahlentyp , insbesondere für sehr große oder sehr kleine Zahlen.
Wenn die JSON -Daten beispielsweise Zahlen wie 12345678901234567890 enthalten, kann es bei der Dekodierung mit JSON_Decode einen Genauigkeitsverlust geben, was zu ungenauen Ergebnissen führt.
Um die Genauigkeit von Zahlen besser zu kontrollieren, bietet PHP verschiedene Methoden, um die Genauigkeit von Zahlen in JSON_DECODE zu bewältigen.
Wenn die Zahlen in JSON den Bereich der Schwimmerpräzision (z. B. große ganze Zahlen) überschreiten können, können diese großen Zahlen mit der Option JSON_BIGINT_AS_STRING in Saiten anstelle von schwimmenden Typen analysiert werden, wenn Sie JSON_DECODE aufrufen. Dies vermeidet Präzisionsverlust, da die Zeichenfolge keine numerischen Informationen verliert.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"big_number": 12345678901234567890}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-number">512</span></span><span>, JSON_BIGINT_AS_STRING);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>->big_number; </span><span><span class="hljs-comment">// Ausgabe "12345678901234567890"</span></span><span>
</span></span>
Auf diese Weise behält PHP die Zahl 12345678901234567890 als Zeichenfolge bei, anstatt sie in einen schwimmenden Wert umzuwandeln, wodurch der Verlust der numerischen Genauigkeit vermieden wird.
Eine andere Lösung besteht darin, eine Präzisionskontrolle auf andere Weise durchzuführen, nachdem JSON -Daten empfangen werden. Verwenden Sie beispielsweise die Erweiterung der GMP (GNU Multiple Precision), um große Zahlen zu verarbeiten. Mit der GMP -Erweiterung können Sie Ganzzahlen von willkürlicher Genauigkeit verarbeiten und können verwendet werden, wenn genaue Berechnungen erforderlich sind.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"big_number": 12345678901234567890}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-variable">$bigNumber</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'big_number'</span></span><span>]);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">gmp_strval</span></span><span>(</span><span><span class="hljs-variable">$bigNumber</span></span><span>); </span><span><span class="hljs-comment">// Ausgabe "12345678901234567890"</span></span><span>
</span></span>
In diesem Beispiel analysieren wir die Nummer in eine Zeichenfolge und verwenden GMP, um sicherzustellen, dass die Zahlengenauigkeit nicht verloren geht.
Wenn die JSON -Daten selbst eine Mischung aus Zahlen und Zeichenfolgen enthalten, ist es am besten, die Datentypen im Umgang mit JSON klar zu unterscheiden. Für Szenarien, die sehr große oder sehr kleine Zahlen enthalten, ist es am besten sicher, dass das entsprechende Datenformat beim Generieren von JSON -Daten verwendet wird. Erwägen Sie, große Zahlen mit wissenschaftlicher Notation oder Stringform zu übergeben, um das Risiko eines Präzisionsverlusts zu verringern.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"big_number": "12345678901234567890"}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'big_number'</span></span><span>]; </span><span><span class="hljs-comment">// Ausgabe "12345678901234567890"</span></span><span>
</span></span>
Auf diese Weise wird das Problem der PHP -Parsen -Zahlen in schwimmende Typen vermieden und die Integrität der Daten beibehalten.
In PHP kann bei dem Vergleich des schwimmenden Typs Ungenauigkeiten auftreten, da schwimmende Typzahlen die Genauigkeit verlieren können. Um dieses Problem zu vermeiden, können Zeichenfolgen oder präzise numerische Typen zum Vergleich verwendet werden, insbesondere wenn es um Finanzierung oder andere Berechnungen geht, die eine hohe Genauigkeit erfordern.
Durch die Verwendung der Option JSON_BIGINT_AS_string wird PHP beim Parsen von JSON alle großen Ganzzahlen in Zeichenfolgen verarbeitet, was die Leistung beeinflussen kann, insbesondere wenn große Datenmengen bearbeitet werden müssen. Bei der Auswahl einer Lösung müssen Sie daher das Gleichgewicht zwischen Datengenauigkeit und Leistung abwägen.
Beim Umgang mit JSON-Daten ist das Problem der digitalen Genauigkeit eine Herausforderung, die nicht ignoriert werden kann, insbesondere wenn es um große Zahlen oder hohe Präzisionsanforderungen geht. PHP bietet verschiedene Möglichkeiten zur Lösung dieses Problems, z. B. mit der Option JSON_BIGINT_AS_STRING in Zeichenfolgen mithilfe der Option JSON_BIGINT_AS_STRING in Zeichenfolgen oder unter Verwendung der GMP -Erweiterung für präzise Berechnungen. Durch die Auswahl der geeigneten Verarbeitungsmethode entsprechend den tatsächlichen Anforderungen kann die Genauigkeit der Daten und die Stabilität des Systems sichergestellt werden.