后端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中filter的用法详解

    springboot中filter的用法详解

    本篇文章主要介绍了springboot中filter的用法详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 基于Java利用static实现单例模式

    基于Java利用static实现单例模式

    这篇文章主要介绍了基于Java利用static实现单例模式,当在多个线程同时触发类的初始化过程的时候static不会被多次执行,下面我们一起进入文章看看具体要的原因
    2022-01-01
  • SpringMVC将请求和响应的数据转换为JSON格式的几种方式

    SpringMVC将请求和响应的数据转换为JSON格式的几种方式

    这篇文章主要给大家介绍饿了SpringMVC将请求和响应的数据转换为JSON格式的几种方式,文中通过代码示例和图文结合给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-11-11
  • Java泛型使用一些常见报错总结

    Java泛型使用一些常见报错总结

    泛型是Java中一种强大的特性,它允许我们编写类型安全且可重用的代码,这篇文章主要介绍了Java泛型使用一些常见报错总结的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-01-01
  • shade解决mybatis包冲突问题

    shade解决mybatis包冲突问题

    这篇文章主要介绍了shade解决mybatis包冲突问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • java Unsafe详细解析

    java Unsafe详细解析

    Unsafe为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用。但是,为了更好地了解java的生态体系,我们应该去学习它,去了解它,不求深入到底层的C/C++代码,但求能了解它的基本功能。下面小编来和大家一起学习
    2019-05-05
  • Java幂等性校验解决重复点击的六种实现方式

    Java幂等性校验解决重复点击的六种实现方式

    在分布式系统中,幂等性(Idempotency)是一个非常重要的概念,,幂等性操作指的是:无论这个操作执行多少次,结果都应该是相同的,这是为了避免重复执行操作引起数据的不一致,本文给大家介绍了Java幂等性校验解决重复点击的六种实现方式,需要的朋友可以参考下
    2025-04-04
  • Java中invokedynamic字节码指令问题

    Java中invokedynamic字节码指令问题

    这篇文章主要介绍了Java中invokedynamic字节码指令问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Java实现Map集合遍历的四种常见方式与用法分析

    Java实现Map集合遍历的四种常见方式与用法分析

    这篇文章主要介绍了Java实现Map集合遍历的四种常见方式与用法,结合实例形式较为详细的分析了java针对Map集合键值对遍历的常见使用技巧与相关操作注意事项,需要的朋友可以参考下
    2018-01-01
  • 实例分析java对象中浅克隆和深克隆

    实例分析java对象中浅克隆和深克隆

    在本篇文章中我们给大家分享了关于java对象中浅克隆和深克隆的相关知识点和相关代码内容,有兴趣的朋友们学习下。
    2018-10-10

最新评论