SpringBoot传给前端Long类型精度丢失的解决方案

 更新时间:2025年03月10日 08:26:24   作者:镜花水月linyi  
最近在做项目的时候,遇到了一个Long类型传给前端之后,接收到的数值不对的情况,我一开始以为是前端接收数据有问题,后来经过查找,了解到这是一个Long类型精度丢失问题,于是写这篇文章记录下来,也探究一下为什么会发生这种情况,需要的朋友可以参考下

背景

  • 后端:Java、SpringBoot......
  • 前端:JavaScript、Vue......

问题展示

接口展示

数据响应展示:

浏览器预览展示:

问题原因

  • Java中,Long类型为64位有符合整数,取值范围是-2^63到2^63-1。
  • JavaScript中,所有数字均基于IEEE 754的双精度浮点数标准,其安全的整数范围是-(2^53-1)到2^53-1。

    超出最大数值的时候Long类型就会精度丢失。

问题解决方案

在SpringBoot将数据传给前端前,会默认使用Jackson序列化Java对象为JSON,Long类型默认将其转换成Number类型,到Long类型的数值超过Javas安全范围的数值时就会发生精度丢失,

方案一:使用@JsonSerialize注解

在你需要处理的字段添加注解。 实现如下面代码所示:

 @Data
 public class Book {
       @JsonSerialize(using = ToStringSerializer.class)
       private Long id;  // 主键ID
       private String name;
   }

方案二:全局配置

将全部Long类型统一处理。实现如下面代码所示:

@Configuration
public class JacksonConfig {

    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        SimpleModule simpleModule = new SimpleModule();
        // 将Long类型序列化为String类型
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }
}

总结

上面两种方案都是将Long类型转换成String类型,前端使用String类型来保存保持精度不发生丢失问题。开始我遇到这个问题的时候,我直接认为是前端代码写的有问题,所有接到的数据才会出现问题,因为我knife4j响应的数据没有问题,结果前端自己搞来搞去了很久,找了其他人,之后才有人说是这个问题,当时的自己实际上是第一次前端后端一起合作开发一个小项目,给我的感受就是有许许多多的问题是只有在实践中才会发现的,而不是坐在大学的课堂中去学,而应该自己主动的去进行技术学习,然后将学的知识运用在开发中,许许多多的问题是只有自己遇到了,才会记忆犹新,并且通过自己解决,下次遇到就有应对之法。

以上就是SpringBoot传给前端Long类型精度丢失的解决方案的详细内容,更多关于SpringBoot Long类型精度丢失的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot整合Redis使用注解进行缓存方式

    SpringBoot整合Redis使用注解进行缓存方式

    文章介绍了使用Redis进行数据缓存的几种方式,包括手动配置RedisTemplate、使用Spring的Caching模块以及配置自定义的RedisCacheManager
    2025-03-03
  • java字符流缓冲区详解

    java字符流缓冲区详解

    这篇文章主要为大家详细介绍了java字符流缓冲区的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 浅谈java实现mongoDB的多条件查询

    浅谈java实现mongoDB的多条件查询

    这篇文章主要介绍了java实现mongoDB的多条件查询,具有一定参考价值,需要的朋友可以参考下。
    2017-09-09
  • 深入浅析Spring-boot-starter常用依赖模块

    深入浅析Spring-boot-starter常用依赖模块

    这篇文章主要介绍了Spring-boot-starter常用依赖模块及spring boot的两大优点,需要的朋友可以参考下
    2018-01-01
  • Java定时器通信协议管理模块Timer详解

    Java定时器通信协议管理模块Timer详解

    这篇文章主要介绍了Java定时器通信协议管理模块Timer, Timer一般指定时器(通信协议管理模块)人类最早使用的定时工具是沙漏或水漏,但在钟表诞生发展成熟之后,人们开始尝试使用这种全新的计时工具来改进定时器,达到准确控制时间的目的
    2022-08-08
  • Java 类型信息详解和反射机制介绍

    Java 类型信息详解和反射机制介绍

    这篇文章主要介绍了Java 类型信息详解和反射机制介绍,需要的朋友可以参考下
    2020-11-11
  • 浅谈为什么Java里面String类是不可变的

    浅谈为什么Java里面String类是不可变的

    这篇文章主要介绍了为什么Java里面String类是不可变的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Springboot使用java.ext.dirs方式的漏洞解析

    Springboot使用java.ext.dirs方式的漏洞解析

    文中给大家介绍了java.ext.dirs在Java9后被弃用,导致兼容性、安全性和管理问题,建议采用SpringBoot的自定义类加载器、模块化系统或容器化技术(如Docker)替代,以提升隔离性与可维护性,下文重点解析Springboot使用java.ext.dirs方式的缺陷,感兴趣的朋友一起看看吧
    2025-08-08
  • Spring注解@Transactional失效的场景分析

    Spring注解@Transactional失效的场景分析

    在使用Spring中事务注解@Transactional时会存在几种场景下该注解失效,即不能按照预期封装成一个事务操作,于是本文文将对该注解进行学习并对相关失效场景进行分析,需要的朋友可以参考下
    2023-07-07
  • Java GUI编程实现在线聊天室

    Java GUI编程实现在线聊天室

    这篇文章主要为大家详细介绍了Java GUI编程实现在线聊天室,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07

最新评论