SpringBoot傳給前端Long類型精度丟失的解決方案
背景
- 后端:Java、SpringBoot......
- 前端:JavaScript、Vue......
問題展示
接口展示
數(shù)據(jù)響應(yīng)展示:
瀏覽器預(yù)覽展示:
問題原因
- Java中,Long類型為64位有符合整數(shù),取值范圍是-2^63到2^63-1。
- JavaScript中,所有數(shù)字均基于IEEE 754的雙精度浮點(diǎn)數(shù)標(biāo)準(zhǔn),其安全的整數(shù)范圍是-(2^53-1)到2^53-1。
超出最大數(shù)值的時(shí)候Long類型就會(huì)精度丟失。
問題解決方案
在SpringBoot將數(shù)據(jù)傳給前端前,會(huì)默認(rèn)使用Jackson序列化Java對(duì)象為JSON,Long類型默認(rèn)將其轉(zhuǎn)換成Number類型,到Long類型的數(shù)值超過Javas安全范圍的數(shù)值時(shí)就會(huì)發(fā)生精度丟失,
方案一:使用@JsonSerialize注解
在你需要處理的字段添加注解。 實(shí)現(xiàn)如下面代碼所示:
@Data public class Book { @JsonSerialize(using = ToStringSerializer.class) private Long id; // 主鍵ID private String name; }
方案二:全局配置
將全部Long類型統(tǒng)一處理。實(shí)現(xiàn)如下面代碼所示:
@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; } }
總結(jié)
上面兩種方案都是將Long類型轉(zhuǎn)換成String類型,前端使用String類型來保存保持精度不發(fā)生丟失問題。開始我遇到這個(gè)問題的時(shí)候,我直接認(rèn)為是前端代碼寫的有問題,所有接到的數(shù)據(jù)才會(huì)出現(xiàn)問題,因?yàn)槲襨nife4j響應(yīng)的數(shù)據(jù)沒有問題,結(jié)果前端自己搞來搞去了很久,找了其他人,之后才有人說是這個(gè)問題,當(dāng)時(shí)的自己實(shí)際上是第一次前端后端一起合作開發(fā)一個(gè)小項(xiàng)目,給我的感受就是有許許多多的問題是只有在實(shí)踐中才會(huì)發(fā)現(xiàn)的,而不是坐在大學(xué)的課堂中去學(xué),而應(yīng)該自己主動(dòng)的去進(jìn)行技術(shù)學(xué)習(xí),然后將學(xué)的知識(shí)運(yùn)用在開發(fā)中,許許多多的問題是只有自己遇到了,才會(huì)記憶猶新,并且通過自己解決,下次遇到就有應(yīng)對(duì)之法。
以上就是SpringBoot傳給前端Long類型精度丟失的解決方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Long類型精度丟失的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MapStruct內(nèi)部錯(cuò)誤:NullPointerException的解決方案
在Java開發(fā)中,MapStruct是一個(gè)非常流行的對(duì)象映射工具,它通過注解處理器在編譯時(shí)生成映射代碼,極大地簡(jiǎn)化了對(duì)象之間的轉(zhuǎn)換操作,本文將詳細(xì)分析一個(gè)常見的MapStruct內(nèi)部錯(cuò)誤——NullPointerException,并提供一系列解決方案,需要的朋友可以參考下2025-02-02基于springboot設(shè)置Https請(qǐng)求過程解析
這篇文章主要介紹了基于springboot設(shè)置Https請(qǐng)求過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08詳解關(guān)于Spring Cloud 框架熱部署的方法
本篇文章主要介紹了詳解關(guān)于Spring Cloud 框架熱部署的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Java實(shí)現(xiàn)雙鏈表互相交換任意兩個(gè)節(jié)點(diǎn)的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)雙鏈表互相交換任意兩個(gè)節(jié)點(diǎn)的方法,簡(jiǎn)單講述了雙鏈表的概念,并結(jié)合實(shí)例形式給出了java雙鏈表實(shí)現(xiàn)任意兩個(gè)節(jié)點(diǎn)交換的操作技巧,需要的朋友可以參考下2017-11-11詳細(xì)介紹Java關(guān)鍵字throw?throws?Throwable的用法與區(qū)別
這篇文章主要介紹了java中throws與throw及Throwable的用法和區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04利用HttpUrlConnection 上傳 接收文件的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄肏ttpUrlConnection 上傳 接收文件的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11