在開發過程中,我經常會遇到後端資料庫的 bigint
欄位資料,尤其是像 ID 或金額這類數字很大的欄位。這些 bigint
資料在後端處理沒問題,但當我把它們包成 JSON 丟到前端時,就常常遇到精度丟失的狀況。
為什麼會發生 bigint 精度丟失?
這問題的根源主要是在 JavaScript 本身的數字型別限制。JavaScript 的 Number
是以 IEEE 754 雙精度浮點數格式儲存的,最大安全整數範圍是:
-(2^53 - 1) 到 2^53 - 1
也就是大約 ±9007199254740991
當 bigint
的數值超出這個範圍,JavaScript 就無法精準表示,數字會自動被四捨五入或變形,造成精度丟失。
這種狀況在 JSON 傳輸過程中也無法避免,因為:
- JSON 標準本身不支援
BigInt
類型 - JSON 僅支援
number
或string
- 當 JSON 解析器看到一個超大的數字,就會轉成 JavaScript 的
Number
,此時就會失去精度
解決方式:丟給前端前先轉成字串
為了解決這個問題,我通常會選擇在後端把 bigint
先轉成字串(string),再包進 JSON 傳給前端。
這樣前端收到的就是字串,不會被 JavaScript 的數字型別誤判成不準確的數字。前端如果需要進一步處理這些數字,也可以使用像 BigInt
或 big.js、decimal.js 等第三方工具來處理精準的數字運算。
總結
這個問題其實不是 JSON 本身的問題,而是 JavaScript 數字型別的限制。
只要我把 bigint
用 字串方式傳遞,再用相對應的大數字工具處理,就能輕鬆避免精度丟失,讓前後端資料保持一致,避免後續因數字不準確而產生的錯誤。
Top comments (0)