使用雪花算法作为id之后,前端精度丢失怎么办?

简介 问题描述:据库id:2045180887314309121 页面传递id:2045180887314309000这个接口返回到id就是:2045180887314309000为什么会这样?问题1:ID精度丢失(JavaScriptNumber精度问题)🔍问题分析数据库 ID: 2045180887314309121前端接收:  204518088

🔔🔔好消息!好消息!🔔🔔

有需要的朋友👉:微信号 kaigejava2022

问题描述:


据库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"  // ✅ 正确


TopTop