记一次SpringBoot传给前端Long类型精度丢失

前言

最近在做项目的时候,遇到了一个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注解

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

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

方案二:全局配置

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

java 复制代码
@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响应的数据没有问题,结果前端自己搞来搞去了很久,找了其他人,之后才有人说是这个问题,当时的自己实际上是第一次前端后端一起合作开发一个小项目,给我的感受就是有许许多多的问题是只有在实践中才会发现的,而不是坐在大学的课堂中去学,而应该自己主动的去进行技术学习,然后将学的知识运用在开发中,许许多多的问题是只有自己遇到了,才会记忆犹新,并且通过自己解决,下次遇到就有应对之法。

相关推荐
老马识途2.01 小时前
关于跨域问题的总结
java·前端
都叫我大帅哥2 小时前
Java日期时间三十年战争:从Date考古到LocalDateTime革命,以及数据库与前端的那点事儿
java
Muscleheng2 小时前
SpringBoot 集成 DeepSeek 实现 RAG 文档问答
java·spring boot·ai·springai
2501_936415692 小时前
可变参数&综合练习&斗地主游戏
java·windows·游戏
颜酱3 小时前
07 | 把字段与指标同步到 Qdrant(生成阶段)
前端·人工智能·后端
Larcher3 小时前
从“加载模型”界面到端侧推理:拆解一个 React + WebGPU 大模型 Demo
javascript·后端
极客先躯3 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
xqqxqxxq4 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
Larcher4 小时前
从状态快照到惰性初始化:读懂 React useState 的三个关键场景
javascript·人工智能·后端
lazy H4 小时前
Git clone 怎么用?克隆项目及常见问题完整教程
大数据·git·后端·学习·搜索引擎·github