后端Long类型ID传给前端精度丢失(变00)的原因分析及解决方案

 更新时间:2026年03月27日 11:12:49   作者:XuCoder  
在Java中long是一种基本数据类型,用于存储64位的整数值,这篇文章主要介绍了后端Long类型ID传给前端精度丢失(变00)的原因分析及解决方案,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在前后端分离的开发中,数据库里存的主键 ID 明明是:1750433246798835714,但是前端接收到数据后,ID 却变成了:1750433246798835700,后几位莫名其妙变成了 0!

导致的结果就是:

前端拿这个错误的 ID 去查询详情或执行删除操作时,后端直接报错“数据不存在”,因为 ID 对不上。

原因分析

这个问题的根源在于 Java 和 JavaScript 对数字处理机制的不同。

Java 中的 Long 类型是 64 位有符号整数,它的取值范围非常大;

而常用的雪花算法 (Snowflake) 生成的 ID 通常就是 19 位的,完全在 Java 的 Long 范围内。

JavaScript 中并没有专门的整数类型,所有的数字本质上都是 IEEE 754 标准的双精度浮点数(Double)。

JS 能安全表示的最大整数(Safe Integer)是253-1,这就导致后端的 19 位 ID传给前端时,因为超过了 JS 的安全整数范围,JS 就会发生精度丢失,自动进行“四舍五入”或者直接丢弃低位,导致后几位变成 0。

解决方案

要解决这个问题,最简单有效的方法是:

后端在返回数据给前端时,把 Long 类型的数据统统转换成 String(字符串)类型。

因为字符串在 JS 里是绝对安全的,不会发生精度丢失。

不需要手动去改每一个 DTO 或 VO 类,只需要在 Spring Boot 中加一个全局配置类,利用 Jackson 的序列化机制自动完成转换。

直接在 config 包下新建一个类JsonConfig.java

/**
 * Spring MVC全局Json配置
 * 用于解决 Long 类型精度丢失问题
 */
@JsonComponent
public class JsonConfig {
    /**
     * 全局配置:将 Long 类型序列化为 String
     */
    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        // 创建 ObjectMapper
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        // 创建自定义序列化模块
        SimpleModule module = new SimpleModule();
        // 将 Long 类(包装类)和 long(基本类型)都序列化为字符串
        // ToStringSerializer.instance 会调用对象的 toString() 方法
        module.addSerializer(Long.class, ToStringSerializer.instance);
        module.addSerializer(Long.TYPE, ToStringSerializer.instance);
        // 注册模块
        objectMapper.registerModule(module);
        return objectMapper;
    }
}

使用这种全局配置 方案,可以一劳永逸地解决项目中所有 Long 类型精度丢失的问题。

总结

到此这篇关于后端Long类型ID传给前端精度丢失(变00)的原因分析及解决方案的文章就介绍到这了,更多相关后端Long类型传前端精度丢失内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot自动配置排除的五种方式

    SpringBoot自动配置排除的五种方式

    本文详细介绍了SpringBoot自动配置排除的核心知识点,包括自动配置的基本逻辑、为何需要排除自动配置、五种排除自动配置的方式,需要的朋友可以参考下
    2026-04-04
  • Java中如何执行多条shell/bat命令

    Java中如何执行多条shell/bat命令

    这篇文章主要介绍了Java中如何执行多条shell/bat命令的方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java中接口和抽象类的区别与相同之处

    Java中接口和抽象类的区别与相同之处

    这篇文章主要介绍了Java中接口和抽象类的区别与相同之处,本文讲解了抽象类的概念、接口的概念、接口和抽象类的区别与联系等内容,需要的朋友可以参考下
    2015-06-06
  • Spring Cloud Zuul的重试配置详解

    Spring Cloud Zuul的重试配置详解

    这篇文章主要介绍了Spring Cloud Zuul的重试配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Java 多线程有序执行的几种方法总结

    Java 多线程有序执行的几种方法总结

    这篇文章主要介绍了Java 多线程有序执行的几种方法总结的相关资料,需要的朋友可以参考下
    2017-03-03
  • 详解Spring中的AOP及AspectJ五大通知注解

    详解Spring中的AOP及AspectJ五大通知注解

    这篇文章主要介绍了详解Spring中的AOP及AspectJ五大通知注解,AOP面向切面编程是一种新的方法论,是对传统OOP面向对象编程的补充,AOP 的主要编程对象是切面(aspect),切面模块化横切关注点,需要的朋友可以参考下
    2023-08-08
  • MyBatis学习教程(七)-Mybatis缓存介绍

    MyBatis学习教程(七)-Mybatis缓存介绍

    MyBatis缓存分为一级缓存和二级缓存一级缓存,本文给大家介绍mybatis缓存知识,非常不错具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-05-05
  • VScode 打造完美java开发环境最新教程

    VScode 打造完美java开发环境最新教程

    这篇文章主要介绍了VScode 打造完美java开发环境最新教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Spring容器三级缓存的使用及说明

    Spring容器三级缓存的使用及说明

    这篇文章主要介绍了Spring容器三级缓存的使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Java杂谈之合格程序员一定要会阅读别人的源码

    Java杂谈之合格程序员一定要会阅读别人的源码

    阅读别人的代码作为开发人员是一件经常要做的事情。一个是学习新的编程语言的时候通过阅读别人的代码是一个最好的学习方法,另外是积累编程经验
    2021-09-09

最新评论