工作空间 / 长 ID 尾数变了:先找到精度丢失发生在哪一层

长 ID 尾数变了:先找到精度丢失发生在哪一层

从接口原文到页面展示,逐层核对订单号,避免修错数据库。

问题场景

订单号在接口响应中是 9007199254740993,页面却显示 9007199254740992。数据库里的值没有变化,应该从哪一层排查?

排查与解法按顺序复现、定位和验证

先保留原始响应

不要先复制页面已经显示出来的数字。打开开发者工具的 Network,保留响应原文,再对比后端日志中的同一个订单号。若原文正确、解析后改变,问题发生在客户端数字转换。

用最小样例复现

JavaScript Number 无法精确表示所有大整数。先比较解析前的文本和解析后的值,确认是否已经超过安全整数范围。

const raw = '{"orderId":9007199254740993}';
const data = JSON.parse(raw);
console.log(data.orderId); // 9007199254740992
console.log(Number.isSafeInteger(data.orderId)); // false

修正接口契约

对只用于标识的 ID,前后端统一使用十进制字符串。后端序列化、前端类型、导出文件和数据库查询参数都要核对。不要只在页面显示时调用 String(),精度一旦丢失就无法补回。

{
  "orderId": "9007199254740993"
}

验证修复

使用安全整数边界两侧的值、19 位 ID、带前导零的业务编号做回归。检查列表、详情、复制、下载和再次提交后数值完全一致。数值计算型字段应另外约定任意精度表示,不能把所有数字都当 ID。

参考资料

MDN · JSON.parse ↗