SpringBoot返回前端Long型丟失精度后兩位變成00的解決
一、前言
在后端開發(fā)中,我們經(jīng)常會(huì)遇到需要將ID作為標(biāo)識(shí)符傳遞給前端的情況。當(dāng)ID為long類型時(shí),如果該ID超過19位,前端JavaScript在處理時(shí)可能會(huì)遇到精度問題,導(dǎo)致最后兩位變成00。本文將探討這一問題的原因以及解決方案。
二、問題描述
2.1、問題背景
在Java中,Long類型的取值范圍是-9223372036854775808到9223372036854775807(即-2^64到2^64-1)。然而實(shí)測(cè)中發(fā)現(xiàn),當(dāng)Long類型超過19位時(shí),容易發(fā)生精度丟失問題,最后兩位數(shù)字變成了00。
說明:
- 通過http請(qǐng)求直接訪問接口拿到響應(yīng)報(bào)文時(shí)精度沒有丟失
- 通過postman,apipost等工具訪問請(qǐng)求時(shí)精度沒有丟失
- 通過前端訪問或者swagger頁(yè)面訪問時(shí)
精度丟失了。
2.2、問題示例

通過swagger調(diào)用接口:

響應(yīng)報(bào)文Long類型的最后兩位變成了00
三、解決方法
3.1、將ID轉(zhuǎn)換為字符串
為了避免精度丟失,我們可以在后端將long類型的ID轉(zhuǎn)換為字符串。這樣,無論ID的長(zhǎng)度如何,前端都可以正確地接收和處理。

3.2、使用@JsonSerialize注解
我們可以使用@JsonSerialize注解來指定ID字段的序列化方式。通過ToStringSerializer類,我們可以確保ID在序列化時(shí)被轉(zhuǎn)換為字符串。
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注解后,雖然實(shí)體類中id類型是Long,但是返回值中是String類型。

3.3、使用@JsonFormat注解
可以使用@JsonFormat(shape = JsonFormat.Shape.STRING)將字段轉(zhuǎn)換為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;
}
響應(yīng)報(bào)文示例:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot傳給前端Long類型精度丟失的解決方案
- SpringBoot返回前端Long類型字段丟失精度問題及解決方案
- SpringBoot分頁(yè)的實(shí)現(xiàn)與long型id精度丟失問題的解決方案介紹
- springboot?Long?精度丟失問題解決
- SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問題
- springboot中使用FastJson解決long類型在js中失去精度的問題
- SpringBoot全局配置long轉(zhuǎn)String丟失精度的問題解決
- SpringBoot全局配置long轉(zhuǎn)String丟失精度問題解決方案
相關(guān)文章
Java的MyBatis框架中Mapper映射配置的使用及原理解析
Mapper用于映射SQL語(yǔ)句,可以說是MyBatis操作數(shù)據(jù)庫(kù)的核心特性之一,這里我們來討論Java的MyBatis框架中Mapper映射配置的使用及原理解析,包括對(duì)mapper的xml配置文件的讀取流程解讀.2016-06-06
mybatis的mapper特殊字符轉(zhuǎn)移及動(dòng)態(tài)SQL條件查詢小結(jié)
mybatis mapper文件中條件查詢符,如>=,<,之類是不能直接寫的會(huì)報(bào)錯(cuò)的需要轉(zhuǎn)移一下,本文給大家介紹了常見的條件查詢操作,對(duì)mybatis的mapper特殊字符及動(dòng)態(tài)SQL條件查詢相關(guān)知識(shí)感興趣的朋友一起看看吧2021-09-09
在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法
本篇文章小編將為大家介紹,關(guān)于在java中 利用匿名內(nèi)部類進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法,有需要的朋友可以參考一下2013-04-04
Java中StringBuilder常用構(gòu)造方法解析
這篇文章主要介紹了Java中StringBuilder常用構(gòu)造方法解析,StringBuilder是一個(gè)可標(biāo)的字符串類,我們可以吧它看成是一個(gè)容器這里的可變指的是StringBuilder對(duì)象中的內(nèi)容是可變的,需要的朋友可以參考下2024-01-01
SpringMVC架構(gòu)的項(xiàng)目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法
下面小編就為大家?guī)硪黄猄pringMVC架構(gòu)的項(xiàng)目 js,css等靜態(tài)文件導(dǎo)入有問題的解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
spring和Mybatis逆向工程的實(shí)現(xiàn)
本文主要介紹了使用Spring和MyBatis進(jìn)行逆向工程,幫助開發(fā)者自動(dòng)生成數(shù)據(jù)庫(kù)相關(guān)的代碼,提高開發(fā)效率和代碼質(zhì)量,具有一定的參考價(jià)值,感興趣的可以了解一下2025-07-07

