前阵子跟人联调接口,发现一个挺隐蔽的 bug:数据库里好好的订单号,前端拿过来比对怎么都对不上,末几位全乱了。查了半天才定位到,是 JSON 传大整数的锅。
根子在于 JavaScript 的 Number 本质是双精度浮点,能精确表示的整数上界只有 2^53 - 1。超过这个范围的,JSON.parse 一解析,低位直接被四舍五入成相近的浮点值,肉眼看不出,相等性判断却已经挂了。其实
中招场景不少:雪花算法生成的 ID、长订单号、身份证号,只要走一遍 JSON 就在不知不觉里失真。后端吐的是 6228480402564890018,前端 parse 完可能变成 6228480402564890000,出错的正好是最该准的几位。
解法不复杂,但得在约定阶段想清楚:超安全整数范围的字段一律按字符串传,或前后端统一上 BigInt。最怕双方都"以为对方处理好了",等线上偶发错乱再回头查,成本就高了。你们遇过类似情况吗,具体栽在哪个字段。