本篇解答兩個常見問題:
- BIGINT 的最大值是多少?
- 為什麼我的 BIGINT 值在轉換為 JSON 後發生了變化?
整數資料型別的範圍
Genero 整數資料型別的最大值如下:
- TINYINT:127(2⁷ − 1)
- SMALLINT:32,767(2¹⁵ − 1)
- INTEGER:2,147,483,647(2³¹ − 1)
- BIGINT:9,223,372,036,854,775,807(2⁶³ − 1)
技術問題:JSON 的精度損失
核心問題在於 JSON 採用 IEEE 754 雙精度浮點數格式。這種格式有精度限制:
「介於 −2⁵³ 到 2⁵³ 之間的整數可以被精確表示。」
超過這個範圍後,精度會逐漸下降。BIGINT 的最大值遠超過 JSON 的可表示範圍,因此在將大型 BIGINT 值轉換為 JSON 格式時,會發生資料遺失的問題。
程式碼範例
以下 Genero 程式碼示範此問題:
IMPORT util
MAIN
DEFINE rec RECORD
x1, x2 BIGINT
END RECORD
DEFINE j util.JSONObject
LET rec.x1 = util.Math.pow(2,53)
LET rec.x2 = rec.x1 + 1
LET j = util.JSONObject.fromFGL(rec)
DISPLAY j.toString()
END MAIN
執行結果顯示 x1 與 x2 的值完全相同,這正是精度損失的具體表現——x2 比 x1 大 1,但 JSON 無法區分這兩個值。
建議
在將 BIGINT 與 JSON 或其他依賴 IEEE 754 格式的函式庫搭配使用時,請務必謹慎。若你的業務資料需要使用超過 2⁵³ 的大整數,應評估是否有精度損失的風險,並考慮使用字串傳遞大數值,以避免資料失真。
原文:https://4js.com/ask-reuben/ig-168/
· 有任何 Genero 技術問題或翻譯疑問,歡迎來信
support@t100.app