SpringBoot返回前端Long型丢失精度后两位变成00的解决
一、前言
在后端开发中,我们经常会遇到需要将ID作为标识符传递给前端的情况。当ID为long类型时,如果该ID超过19位,前端JavaScript在处理时可能会遇到精度问题,导致最后两位变成00。本文将探讨这一问题的原因以及解决方案。
二、问题描述
2.1、问题背景
在Java中,Long类型的取值范围是-9223372036854775808到9223372036854775807(即-2^64到2^64-1)。然而实测中发现,当Long类型超过19位时,容易发生精度丢失问题,最后两位数字变成了00。
说明:
- 通过http请求直接访问接口拿到响应报文时精度没有丢失
- 通过postman,apipost等工具访问请求时精度没有丢失
- 通过前端访问或者swagger页面访问时
精度丢失了。
2.2、问题示例

通过swagger调用接口:

响应报文Long类型的最后两位变成了00
三、解决方法
3.1、将ID转换为字符串
为了避免精度丢失,我们可以在后端将long类型的ID转换为字符串。这样,无论ID的长度如何,前端都可以正确地接收和处理。

3.2、使用@JsonSerialize注解
我们可以使用@JsonSerialize注解来指定ID字段的序列化方式。通过ToStringSerializer类,我们可以确保ID在序列化时被转换为字符串。
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Student {
@JsonSerialize(using = ToStringSerializer.class)
private long id;
private String name;
}

注意:
添加@JsonSerialize注解后,虽然实体类中id类型是Long,但是返回值中是String类型。

3.3、使用@JsonFormat注解
可以使用@JsonFormat(shape = JsonFormat.Shape.STRING)将字段转换为String类型
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Student {
@JsonFormat(shape = JsonFormat.Shape.STRING)
private long id;
private String name;
}
响应报文示例:

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java的MyBatis框架中Mapper映射配置的使用及原理解析
Mapper用于映射SQL语句,可以说是MyBatis操作数据库的核心特性之一,这里我们来讨论Java的MyBatis框架中Mapper映射配置的使用及原理解析,包括对mapper的xml配置文件的读取流程解读.2016-06-06
mybatis的mapper特殊字符转移及动态SQL条件查询小结
mybatis mapper文件中条件查询符,如>=,<,之类是不能直接写的会报错的需要转移一下,本文给大家介绍了常见的条件查询操作,对mybatis的mapper特殊字符及动态SQL条件查询相关知识感兴趣的朋友一起看看吧2021-09-09
SpringMVC架构的项目 js,css等静态文件导入有问题的解决方法
下面小编就为大家带来一篇SpringMVC架构的项目 js,css等静态文件导入有问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-10-10


最新评论