使用雪花算法作为id之后,前端精度丢失怎么办?
- 工作小总结&小工具类
- 时间:2026-04-18 01:18
- 105人已阅读
简介
问题描述:据库id:2045180887314309121 页面传递id:2045180887314309000这个接口返回到id就是:2045180887314309000为什么会这样?问题1:ID精度丢失(JavaScriptNumber精度问题)🔍问题分析数据库 ID: 2045180887314309121前端接收: 204518088
🔔🔔好消息!好消息!🔔🔔
有需要的朋友👉:微信号
问题描述:
据库id:2045180887314309121 页面传递id:2045180887314309000
这个接口返回到id就是:2045180887314309000 为什么会这样 ?
问题 1:ID 精度丢失(JavaScript Number 精度问题)
🔍 问题分析
数据库 ID: 2045180887314309121 前端接收: 2045180887314309000 ❌ 最后几位变成了 000
原因:JavaScript 的 Number 类型最大安全整数是 2^53 - 1 = 9007199254740991,而你的 ID 2045180887314309121 超过了这个范围,导致精度丢失。
✅ 解决方案:将 ID 作为字符串传输
需要将所有 ID 字段从 number 改为 string。但更好的方案是在后端配置 Jackson 序列化时将 Long 类型转为字符串:
创建一个 Jackson 配置类来处理 Long 类型序列化:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
/**
* Jackson 配置
* 解决 JavaScript Number 精度丢失问题:将 Long 类型序列化为字符串
*/
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
// 创建模块,注册 Long 类型的自定义序列化器
SimpleModule simpleModule = new SimpleModule();
// 将所有 Long 类型序列化为字符串,避免前端 JavaScript 精度丢失
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
return objectMapper;
}
}📊 效果对比
// 修复前(精度丢失)
{
"id": 2045180887314309000 // ❌ 错误
}
// 修复后(字符串传输)
{
"id": "2045180887314309121" // ✅ 正确