現在の位置: ホーム> 最新記事一覧> JSONを解析するときにJSON_DECODE関数が数値精度を失うことを避ける方法は?

JSONを解析するときにJSON_DECODE関数が数値精度を失うことを避ける方法は?

gitbox 2025-09-12
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 次の部分は、記事の内容とは何の関係もありません</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"これが例の開始コードです\n"</span></span><span>;
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">demo</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-string">"Demo function output"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>

<hr>

</span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// テキストを開始します</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<h1>それを避ける方法 json_decode 関数は解析です JSON デジタル精度は失われます?</h1>"</span></span><span>;

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<p>存在する PHP 真ん中,使用 <code>json_decode
" ;エコー

JSON_DECODEを使用して直接解析する場合:

;エコー "
\ $ data = json_decode(\ $ json、true); \ nvar_dump(\ $ data);
"
;エコー

得られた結果は、科学的表記表現になるか、最終番号が失われるようになる不正確な数を引き起こす可能性があります。

エコー "

解決

"
;エコー

解決策の中心的な考え方は、整数や浮動小数点数に直接解析するのではなく、弦として多数を処理することです。次の方法が一般的に使用されます。

エコー

方法1: json_bigint_as_stringオプションを使用してください

;エコー "
\ $ data = json_decode(\ $ json、true、512、json_bigint_as_string); \ nvar_dump(\ $ data);
"; "
;エコー

ここでのJSON_BIGINT_AS_STRINGは、PHP整数の範囲を超える数値を文字列に変換し、それによって精度の損失を回避します。

エコー

方法2:JSON世代の終わりの文字列に多数を変換

エコー

JSONデータ生成を制御すると、JSONを生成するときに多数を引用符で包むことができます。

;エコー "
{\" Big_Number \ ":\" 12345678901234567890 \ "}
"
;エコー

このように、文字列は、精度を失うことなくPHP解析中に直接取得されます。

エコー

方法3:任意の精度数学ライブラリを使用して処理する

エコー

多数で数学を行う必要がある場合は、PHPのBCMATHまたはGMP拡張機能を使用できます。

;エコー "
\ $ bignumber = \ $ data [&#39;big_number&#39;]; \ necho bcadd(\ $ bignumber、 &#39;1&#39;);
"
;エコー

これにより、流動点の精度の問題を回避するために、計算を正確に実行できます。

エコー "

まとめ

"
;エコー "
    "
;エコー
  • PHPは、JSONを解析するときに大断片で精密損失を経験する可能性があります。
  • エコー
  • JSON_BIGINT_AS_STRINGを使用するか、数字を事前に文字列に変換することは一般的な解決策です。
  • ;エコー
  • 数学操作が必要な場合は、 BCMATHまたはGMP拡張機能を使用することをお勧めします。
  • エコー "" ; ?>