当前位置: 首页> 最新文章列表> 怎样避免 json_decode 函数在解析 JSON 时出现数字精度丢失的情况?

怎样避免 json_decode 函数在解析 JSON 时出现数字精度丢失的情况?

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
"; echo "

如果直接使用 json_decode 解析:

"
; echo "
\$data = json_decode(\$json, true);\nvar_dump(\$data);
"
; echo "

得到的结果可能会出现数字不准确,变成科学计数法表示或末尾数字丢失。

"
; echo "

解决方案

"
; echo "

解决的核心思路是把大数字作为字符串处理,而不是直接解析为整数或浮点数。以下几种方法常用:

"
; echo "

方法一:使用 JSON_BIGINT_AS_STRING 选项

"
; echo "
\$data = json_decode(\$json, true, 512, JSON_BIGINT_AS_STRING);\nvar_dump(\$data);
"
; echo "

这里的 JSON_BIGINT_AS_STRING 会把超过 PHP 整数范围的数字转换为字符串,从而避免精度丢失。

"
; echo "

方法二:在 JSON 生成端把大数字转成字符串

"
; echo "

如果你控制 JSON 数据生成,可以在生成 JSON 时把大数字用引号包起来:

"
; echo "
{\"big_number\": \"12345678901234567890\"}
"
; echo "

这样 PHP 解析时会直接得到字符串,不会丢失精度。

"
; echo "

方法三:使用任意精度数学库处理

"
; echo "

如果需要对大数字做数学运算,可以使用 PHP 的 bcmathgmp 扩展:

"
; echo "
\$bigNumber = \$data['big_number'];\necho bcadd(\$bigNumber, '1');
"
; echo "

这样可以在任意精度下进行计算,避免浮点精度问题。

"
; echo "

总结

"
; echo "
    "; echo "
  • PHP 在解析 JSON 时对大整数可能出现精度丢失。
  • "
    ; echo "
  • 使用 JSON_BIGINT_AS_STRING 或提前把数字转为字符串是常见解决方案。
  • "
    ; echo "
  • 如果需要进行数学运算,建议使用 bcmathgmp 扩展。
  • "
    ; echo "
"
; ?>