返回目录

JSON 看起来没变,为什么长整数被改了

离线文本版 · Markdown 标记与示例按原文保留。

JSON 文本可以表示很长的数字,但接收端如何保存和运算,取决于语言与库。浏览器里的格式化工具常常会先解析再序列化,这一步可能改变超出精度范围的整数。

<!-- more -->

## JavaScript Number 的边界

JavaScript 常用 Number 是双精度浮点数,安全整数范围由 Number.MAX_SAFE_INTEGER 定义。超出范围后,某些相邻整数无法区分。解析成功只说明 JSON 语法可接受,不保证每个数字原样保留。

## 标识符更适合字符串

订单号、账户编号和雪花 ID 通常不需要数学运算。把它们作为字符串传递,可以避免跨语言接口中的精度问题。这个约定需要生产端和消费端一致,而不能只在显示时补引号。

## 格式化与文本保真不是一回事

JSON.parse 加 JSON.stringify 会规范化空白和数值表示,也可能改变重复键的处理结果。如果需要原文证据、签名校验或精准比较,应保留原始字节,而不是经过格式化再存档。

## 如何处理需要精确数值的输入

对任意精度整数,可使用明确支持该能力的解析器;货币金额还应约定单位和舍入规则。本站浏览器 JSON 工具适合一般配置检查,不适合作为超长整数或原文签名数据的无损转换器。

## 操作参考

```text
console.log(Number.MAX_SAFE_INTEGER)
console.log(Number.isSafeInteger(9007199254740992))
// 标识符建议使用字符串
const record = { id: "9007199254740993" }
```

示例中的域名、文件名和地址需按实际环境替换。涉及生产配置时,先保留可恢复副本,再做修改。

## 参考资料

- [官方文档与技术说明](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)
- [在线工具箱](/tools/) · [项目下载](/downloads/)