前阵子联调一个接口,死活对不上数据。后端返回的主键是个挺大的雪花ID,到了前端一打印,后面几位直接被抹平了。查了半天还以为后端写错,最后发现是前端解析那一步就丢了,我愣了好一会儿才反应过来。
说白了 JS 的 Number 走 IEEE 754 双精度,安全整数上限就 Number.MAX_SAFE_INTEGER 那么一丁点,2^53-1,约 9.007e15。不是超过这个数,JS 根本保不住精度。而 JSON 规范里压根没有独立整数类型,后端那个 int64 一进 JS 的坑,常常就被悄悄转成 9.xxxe18 这种浮点表示,肉眼都不容易看出来。服了
卧槽
后来我们定了规矩,可能超范围的 ID 一律走字符串,前端别拿裸 number 去接;实在改不动的老接口就上 json-bigint 兜底。与其半夜对着错乱主键 debug,不如从契约上把它掐死在摇篮里。这坑最烦人的就是它不报错,安静得很,等发现数据对不上,往往已经脏了一片哈哈