當前位置: 首頁> 最新文章列表> 怎樣避免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[&#39;big_number&#39;];\necho bcadd(\$bigNumber, &#39;1&#39;);
"
; echo "

這樣可以在任意精度下進行計算,避免浮點精度問題。

"
; echo "

總結

"
; echo "
    "
; echo "
  • PHP 在解析JSON 時對大整數可能出現精度丟失。
  • "
    ; echo "
  • 使用JSON_BIGINT_AS_STRING或提前把數字轉為字符串是常見解決方案。
  • "
    ; echo "
  • 如果需要進行數學運算,建議使用bcmathgmp擴展。
  • "
    ; echo " " ; ?>