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í)測中發(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頁面訪問時(shí)
精度丟失了。
2.2、問題示例

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

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

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分頁的實(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)文章
處理Log4j2不能打印行號(hào)的問題(AsyncLogger)
這篇文章主要介紹了處理Log4j2不能打印行號(hào)的問題(AsyncLogger),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java中的相除(/)和取余(%)的實(shí)現(xiàn)方法
這篇文章主要介紹了Java中的相除(/)和取余(%)的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Spring整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Spring 整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java讀取Excel文件內(nèi)容的簡單實(shí)例
這篇文章主要介紹了Java讀取Excel文件內(nèi)容的簡單實(shí)例,有需要的朋友可以參考一下2013-11-11
Java實(shí)戰(zhàn)項(xiàng)目 醫(yī)院預(yù)約掛號(hào)系統(tǒng)
本文是一個(gè)Java語言編寫的實(shí)戰(zhàn)項(xiàng)目,是一個(gè)醫(yī)院預(yù)約掛號(hào)系統(tǒng),主要用到了jdbc+jsp+mysql+ajax等技術(shù),技術(shù)含量比較高,感興趣的童鞋跟著小編往下看吧2021-09-09
Map映射LinkedHashSet與LinkedHashMap應(yīng)用解析
這篇文章主要為大家介紹了Map映射LinkedHashSet與LinkedHashMap的應(yīng)用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步2022-03-03

