前后端Long类型ID精度丢失问题
Java 的
Long
类型可以表示-2^63
到2^63-1
的整数JavaScript 的
Number
类型是基于 IEEE 754 双精度浮点数标准,只能安全表示 -2^53 到 2^53 之间的整数。前端接收到的 JSON 中
userId: 1975534353465823200
(数字格式),JavaScript 将其解析为Number
类型,超出精度范围,精度丢失,变成1975534353465823234
安全整数范围:
-9007199254740991
到9007199254740991
超出范围的数字会丢失精度
比如:
// JavaScript 安全整数 console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991// 超出安全范围的数字 const id = 1975534353465823200; console.log(id); // 1975534353465823234 ← 最后几位发生变化!
解决方法:
后端序列化时转为字符串,在所有返回给前端的 VO 类中,对
Long
类型的 ID 字段添加注解:/*** 使用字符串序列化避免前端精度丢 */ @JsonSerialize(using = ToStringSerializer.class) private Long id;