本篇解答兩個常見問題:

  • 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

執行結果顯示 x1x2 的值完全相同,這正是精度損失的具體表現——x2x1 大 1,但 JSON 無法區分這兩個值。

建議

在將 BIGINT 與 JSON 或其他依賴 IEEE 754 格式的函式庫搭配使用時,請務必謹慎。若你的業務資料需要使用超過 2⁵³ 的大整數,應評估是否有精度損失的風險,並考慮使用字串傳遞大數值,以避免資料失真。

原文:https://4js.com/ask-reuben/ig-168/  ·  有任何 Genero 技術問題或翻譯疑問,歡迎來信 support@t100.app