在使用Snowflake算法生成的64位长整型ID时,前端JavaScript处理大整数时会出现精度丢失问题。这是因为JavaScript的Number类型只能精确表示到2^53-1(约9×10^15),超过这个范围的整数会丢失精度,导致前端显示或处理ID时出现错误。
JavaScript的Number类型使用IEEE 754双精度浮点数标准,只能安全表示53位精度的整数。Snowflake ID通常是64位,超过了这个限制。
将API响应中的ID字段类型从Long改为String,让前端以字符串形式处理ID,避免精度丢失。
修改响应VO类
Long改为String修改服务层转换逻辑
record.getId().toString()进行转换保持请求参数类型
// 响应VO
public class PhysicalDataResponse {
@Schema(description = "记录ID")
private String id; // 改为String类型
// ...其他字段
}
// 服务层转换
PhysicalDataResponse r = new PhysicalDataResponse();
BeanUtils.copyProperties(record, r);
r.setId(record.getId().toString()); // 关键转换
在前后端分离架构中,当遇到大整数精度问题时,优先考虑在API层面将数字类型转换为字符串类型返回,这样既保证了数据准确性,又避免了前端处理复杂性。字符串类型在JSON传输中是安全的,不会丢失精度。