问题场景
订单号在接口响应中是 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。