如何避免 JSON 解析中 BigInt 导致的 64 位整型 ID 精度丢失及溢出问题使用 BigInt?
- 内容介绍
- 文章标签
- 相关推荐
本文共计665个文字,预计阅读时间需要3分钟。
直接使用`JSON.parse()`解析64位整型ID时,JavaScript会将它转换为`Number`类型。一旦超过`Number.MAX_SAFE_INTEGER`(即9007199254740991),末尾数字就会被逐渐截断。这不是bug,而是语言底层的限制。`BigInt`类型本身不能解决解析阶段的精度损失问题,但结合`json-bigint`这类工具,可以从源头上截断并正确地加载大整数。
为什么原生 BigInt 不能单独解决问题
BigInt 是 JavaScript 的数据类型,但它不参与标准 JSON 解析流程:
• JSON.parse('{ "id": 1234567890123456789 }') 永远返回 { id: 1234567890123456800 },此时精度已丢失,再转 1234567890123456800n 也没用;
• JSON.stringify({ id: 1234567890123456789n }) 会直接报错 TypeError: Do not know how to serialize a BigInt。
本文共计665个文字,预计阅读时间需要3分钟。
直接使用`JSON.parse()`解析64位整型ID时,JavaScript会将它转换为`Number`类型。一旦超过`Number.MAX_SAFE_INTEGER`(即9007199254740991),末尾数字就会被逐渐截断。这不是bug,而是语言底层的限制。`BigInt`类型本身不能解决解析阶段的精度损失问题,但结合`json-bigint`这类工具,可以从源头上截断并正确地加载大整数。
为什么原生 BigInt 不能单独解决问题
BigInt 是 JavaScript 的数据类型,但它不参与标准 JSON 解析流程:
• JSON.parse('{ "id": 1234567890123456789 }') 永远返回 { id: 1234567890123456800 },此时精度已丢失,再转 1234567890123456800n 也没用;
• JSON.stringify({ id: 1234567890123456789n }) 会直接报错 TypeError: Do not know how to serialize a BigInt。

