DEV Community

ian chen
ian chen

Posted on • Edited on

處理後端 BigInt 傳到前端時精度丟失的問題

在開發過程中,我經常會遇到後端資料庫的 bigint 欄位資料,尤其是像 ID 或金額這類數字很大的欄位。這些 bigint 資料在後端處理沒問題,但當我把它們包成 JSON 丟到前端時,就常常遇到精度丟失的狀況。


為什麼會發生 bigint 精度丟失?

這問題的根源主要是在 JavaScript 本身的數字型別限制。JavaScript 的 Number 是以 IEEE 754 雙精度浮點數格式儲存的,最大安全整數範圍是:

-(2^53 - 1) 到 2^53 - 1
也就是大約 ±9007199254740991
Enter fullscreen mode Exit fullscreen mode

bigint 的數值超出這個範圍,JavaScript 就無法精準表示,數字會自動被四捨五入或變形,造成精度丟失。

這種狀況在 JSON 傳輸過程中也無法避免,因為:

  • JSON 標準本身不支援 BigInt 類型
  • JSON 僅支援 numberstring
  • 當 JSON 解析器看到一個超大的數字,就會轉成 JavaScript 的 Number,此時就會失去精度

解決方式:丟給前端前先轉成字串

為了解決這個問題,我通常會選擇在後端把 bigint 先轉成字串(string),再包進 JSON 傳給前端。

這樣前端收到的就是字串,不會被 JavaScript 的數字型別誤判成不準確的數字。前端如果需要進一步處理這些數字,也可以使用像 BigIntbig.jsdecimal.js 等第三方工具來處理精準的數字運算。


總結

這個問題其實不是 JSON 本身的問題,而是 JavaScript 數字型別的限制。

只要我把 bigint字串方式傳遞,再用相對應的大數字工具處理,就能輕鬆避免精度丟失,讓前後端資料保持一致,避免後續因數字不準確而產生的錯誤。

Top comments (0)