Spring Boot返回前端Long型丢失精度 后两位 变成00

一、前言

在后端开发中,我们经常会遇到需要将ID作为标识符传递给前端的情况。当ID为long类型时,如果该ID超过19位,前端JavaScript在处理时可能会遇到精度问题,导致最后两位变成00。本文将探讨这一问题的原因以及解决方案。

二、问题描述

2.1、问题背景

在Java中,Long类型的取值范围是-92233720368547758089223372036854775807(即-2^642^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;
}

响应报文示例:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月天的尾巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值