Java Long轉(zhuǎn)JSON出現(xiàn)精度丟失問(wèn)題及解決
問(wèn)題分析
Java Long 類(lèi)型轉(zhuǎn)為 JSON 時(shí)可能出現(xiàn)精度丟失的原因主要包括 JSON 的通用數(shù)字類(lèi)型不指定位數(shù)大小以及JavaScript 存儲(chǔ)大數(shù)字時(shí)的精度限制。
- JSON 的通用數(shù)字類(lèi)型不指定位數(shù)大小:JSON 作為一種跨平臺(tái)的數(shù)據(jù)交換格式,其數(shù)字類(lèi)型是通用的,不指定位數(shù)大小。這意味著在將Java中的Long類(lèi)型( 64位 有符號(hào)整數(shù),范圍從-9,223,372,036,854,775,808到9,223,372,036,854,775,807)序列化為 JSON 字符串時(shí),如果數(shù)字超出了 JSON 能夠精確表示的范圍,就可能導(dǎo)致精度丟失。
- JavaScript 存儲(chǔ)大數(shù)字時(shí)的精度限制:在 JavaScript 中,整數(shù)表達(dá)存在精度限制,最多能表達(dá)的數(shù)字位數(shù)為 15 位。當(dāng)數(shù)字超過(guò) 15 位時(shí),JavaScript會(huì)出現(xiàn)精度丟失問(wèn)題,表現(xiàn)為數(shù)字被截?cái)嗷蛞钥茖W(xué)計(jì)數(shù)法表示。
- 例如,當(dāng) JavaScript 嘗試表示一個(gè)超過(guò) 15位 的整數(shù)時(shí),最后幾位數(shù)字可能會(huì)變?yōu)?,導(dǎo)致精度丟失。
解決方案
- 局部設(shè)置:在 Java 對(duì)象中,可以為 Long 類(lèi)型的字段添加
@JsonFormat(shape = JsonFormat.Shape.STRING)注解,這樣在序列化為 JSON 時(shí),Long 類(lèi)型會(huì) 被當(dāng)作字符串處理,從而避免精度丟失問(wèn)題。 - 全局設(shè)置:在 Spring 框架中,可以通過(guò)配置
ObjectMapper來(lái)設(shè)置全局的序列化行為,例如使用ToStringSerializer來(lái)確保 Long 類(lèi)型被序列化為字符串格式,或者在配置中添加自定義的序列化模塊來(lái)處理 Long 類(lèi)型的序列化。
問(wèn)題實(shí)例
后端

前端
前端后端數(shù)據(jù)的 id 是對(duì)不上的!?。?! 前端接收的數(shù)據(jù)中id后三位是不對(duì)的,出現(xiàn)了精度丟失。


解決方法
添加一個(gè)全局配置
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.jackson.JsonComponent;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
/**
* Spring MVC Json 配置
*
* @author lhd
*/
@JsonComponent
public class JsonConfig {
/**
* 添加 Long 轉(zhuǎn) json 精度丟失的配置
*/
@Bean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(module);
return objectMapper;
}
}
前后端數(shù)據(jù)中的 id 對(duì)上了

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深度解析Java常量池中的Integer緩沖池和String常量池
為了減少對(duì)象重復(fù)創(chuàng)建、提升運(yùn)行時(shí)效率,Java 內(nèi)部提供了兩種重要的優(yōu)化機(jī)制Integer 緩沖池(IntegerCache)和 String 常量池(String Pool),本文將深入剖析兩大常量池的底層實(shí)現(xiàn)、工作流程、適用范圍,并通過(guò)流程圖和代碼示例幫助你徹底掌握2026-05-05
SpringBoot+Vue3實(shí)現(xiàn)七牛云大視頻上傳
詳解Java Web如何限制訪(fǎng)問(wèn)的IP的兩種方法
java中實(shí)現(xiàn)對(duì)象排序的兩種方法(Comparable,Comparator)
mybatis如何封裝List<String>類(lèi)型屬性
SpringMVC異常處理知識(shí)點(diǎn)總結(jié)

