说真的,后端把订单号老老实实按 64 位整数返回,前端 JSON.parse 一把,它就成了浮点数。结果第 16 位往后那位兄弟直接被四舍五入请出了门。你拿着这个"整过容"的 ID 再发回去,数据库一看:这谁啊,不认识。
最离谱的是这 bug 还看运气。小号没事,大号才露馅;测试环境风平浪静,线上偶发抽风。一群人围着日志猜了半天玄学,最后发现是 JavaScript 的 Number 只有 53 位有效数字——你那 ID 一旦越过这条线,精度就不是你的了。
服了
有人说用字符串传不就完了。对,道理都懂,可架不住有人图省事直接序列化对象,Schema 里明晃晃写着 integer。等到对账对不上,才知道"省事"省出了一场事故。
这坑教会我的事挺朴素:跨边界传数字,先想清楚它到底还是不是"数字"。该上字符串上字符串,该用 BigInt 用 BigInt。你们还踩过哪些看起来人畜无害、实则暗藏杀机的"数字"?