現在の位置: ホーム> 最新記事一覧> JSON_DECODE関数を使用するときにJSONの数値精度の問題を正しく処理する方法は?

JSON_DECODE関数を使用するときにJSONの数値精度の問題を正しく処理する方法は?

gitbox 2025-09-02

1.なぜデジタル精度の問題が発生するのですか?

JSON形式で使用される数値タイプは、JavaScriptに基づいた数値タイプで、正確性に特定の制限があります。 JavaScriptのタイプは、IEEE 754ダブル精度フローティングポイント番号標準(64ビット)に基づいており、表現できる最大精度は15〜17ビットの有意数です。 JSONデータにこの精度範囲を超える数値が含まれている場合、変換プロセス中に精度が失われる可能性があります。

PHPでは、 JSON_DECODEはJSONのフローティングタイプ( FLOAT )に数値を解析します。これはIEEE 754標準にも基づいています。このタイプは、特に非常に多数または非常に少ない数で、JavaScriptのタイプと精度が異なります。

たとえば、JSONデータに12345678901234567890などの数値が含まれている場合、 json_decodeを使用してデコードする場合、結果は不正確になる場合があります。

2。デジタル精度の問題を解決する方法は?

数値の精度をより適切に制御するために、PHPはjson_decodeの数字の精度を処理するためのいくつかの方法を提供します。

2.1 json_bigint_as_stringオプションを使用します

JSONの数値がフロート精度(大整数など)の範囲を超える可能性がある場合、 json_decodeを呼び出すときにjson_bigint_as_stringオプションを使用して、これらの大量をフローティングタイプの代わりに文字列に解析できます。これは、文字列が数値情報を失うことはないため、精密損失を回避します。

 <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>-&gt;big_number;  </span><span><span class="hljs-comment">// 出力 "12345678901234567890"</span></span><span>
</span></span>

このようにして、PHPは数12345678901234567890をストリングとして変換する代わりに文字列として保持し、数値精度の損失を回避します。

2.2デジタル精度の手動処理

別の解決策は、JSONデータを受信した後、他の方法で精密制御を実行することです。たとえば、GMP(GNU複数の精度)拡張を使用して、多数を処理します。 GMP拡張により、任意の精度の整数を処理でき、正確な計算が必要な場合に使用できます。

 <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">// 出力 "12345678901234567890"</span></span><span>
</span></span>

この例では、数字を文字列に解析し、GMPを使用して、数の精度が失われないようにします。

2.3適切なデータ形式を使用します

JSONデータ自体に数字と文字列の混合が含まれている場合、JSONを扱うときにデータ型を明確に区別することが最善です。非常に多数または非常に少ない数字を含むシナリオの場合、JSONデータを生成するときに適切なデータ形式が使用されるようにすることをお勧めします。科学的表記法または文字列形式を使用して多数を渡すことを検討して、精度の損失のリスクを減らすことを検討してください。

 <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">// 出力 "12345678901234567890"</span></span><span>
</span></span>

このようにして、PHPの解析番号を浮動型に解析する問題は回避され、データの整合性が維持されます。

3。その他の予防策

3.1フローティングタイプの比較

PHPでは、浮動型の数値が精度を失う可能性があるため、浮動型を比較す​​ると不正確さが生じる可能性があります。この問題を回避するために、特に高精度を必要とする資金またはその他の計算に関しては、文字列または正確な数値タイプを比較に使用できます。

3.2パフォーマンスに関する考慮事項

JSON_BIGINT_AS_STRINGオプションを使用すると、PHPはJSONを解析するときにすべての大きな整数を文字列に処理します。これは、特に大量のデータを処理する必要がある場合にパフォーマンスに影響を与える可能性があります。したがって、ソリューションを選択するときは、データの精度とパフォーマンスのバランスを比較検討する必要があります。

4。概要

JSONデータを処理する場合、デジタル精度の問題は、特に多数または高精度の要件に関しては無視できない課題です。 PHPは、 JSON_BIGINT_AS_STRINGオプションを使用して、または正確な計算のためにGMP拡張機能を使用して、多くの数字を文字列に解析するなど、この問題を解決するいくつかの方法を提供します。実際のニーズに応じて適切な処理方法を選択すると、データの正確性とシステムの安定性を確保できます。