Le type de nombre utilisé au format JSON est le type de nombre basé sur JavaScript, qui a certaines limitations de précision. Le type de nombre de JavaScript est basé sur la norme de numéro de point flottante à double précision IEEE 754 (64 bits), et la précision maximale qui peut être représentée est de 15 à 17 bits. Lorsque les données JSON contiennent des nombres qui dépassent cette plage de précision, la précision peut être perdue pendant le processus de conversion.
Dans PHP, JSON_DECODE analyse les numéros dans JSON en type flottant ( Float ), qui est également basé sur la norme IEEE 754. Ce type diffère par précision du type de nombre de JavaScript, en particulier pour les nombres très grands ou très petits.
Par exemple, si les données JSON contiennent des nombres tels que 12345678901234567890 , lors du décodage à l'aide de JSON_DECOD , il peut y avoir une perte de précision, entraînant des résultats inexacts.
Afin de mieux contrôler la précision des nombres, PHP fournit plusieurs méthodes pour gérer la précision des nombres dans json_decode .
Si les nombres dans JSON peuvent dépasser la plage de précision de flottaison (tels que les grands entiers), ces grands nombres peuvent être analysés en chaînes au lieu de types flottants en utilisant l'option JSON_BIGINT_AS_STRING lors de l'appel JSON_DECODE . Cela évite la perte de précision, car la chaîne ne perd aucune information numérique.
<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">// Sortir "12345678901234567890"</span></span><span>
</span></span>
De cette façon, PHP conserve le nombre 12345678901234567890 comme une chaîne au lieu de le convertir en valeur flottante, évitant ainsi la perte de précision numérique.
Une autre solution consiste à effectuer un contrôle de précision d'autres manières après avoir reçu des données JSON. Par exemple, utilisez une extension GMP (GNU multiple de précision) pour traiter de grands nombres. L'extension GMP vous permet de traiter des entiers de précision arbitraire et peut être utilisé lorsque des calculs précis sont nécessaires.
<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">// Sortir "12345678901234567890"</span></span><span>
</span></span>
Dans cet exemple, nous analysons le numéro dans une chaîne et utilisons GMP pour nous assurer que la précision du nombre n'est pas perdue.
Si les données JSON lui-même contient un mélange de nombres et de chaînes, il est préférable de distinguer clairement les types de données lorsqu'ils traitent avec JSON. Pour les scénarios contenant des nombres très grands ou très petits, il est préférable de s'assurer que le format de données approprié est utilisé lors de la génération de données JSON. Envisagez de passer de grands nombres en utilisant une notation scientifique ou une forme de chaîne pour réduire le risque de perte de précision.
<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">// Sortir "12345678901234567890"</span></span><span>
</span></span>
De cette façon, le problème des nombres d'analyse PHP en types flottants est évité et l'intégrité des données est maintenue.
En PHP, comme les nombres de type flottants peuvent perdre la précision, une imprécision peut se produire lors de la comparaison du type flottant. Pour éviter ce problème, des chaînes ou des types numériques précis peuvent être utilisés à titre de comparaison, en particulier en ce qui concerne les finances ou d'autres calculs qui nécessitent une haute précision.
L'utilisation de l'option JSON_BIGINT_AS_STRING amène PHP à traiter tous les grands entiers en chaînes lors de l'analyse de JSON, ce qui peut affecter les performances, en particulier lorsque de grandes quantités de données doivent être traitées. Par conséquent, lorsque vous choisissez une solution, vous devez peser l'équilibre entre la précision des données et les performances.
Lorsque vous traitez avec les données JSON, le problème de précision numérique est un défi qui ne peut pas être ignoré, en particulier en ce qui concerne les grands nombres ou les exigences de haute précision. PHP fournit plusieurs façons de résoudre ce problème, tels que l'analyse de grands nombres en chaînes en utilisant l'option JSON_BIGINT_AS_STRING , ou en utilisant l'extension GMP pour des calculs précis. Le choix de la méthode de traitement appropriée en fonction des besoins réels peut garantir la précision des données et la stabilité du système.