Java Long轉JSON出現(xiàn)精度丟失問題及解決
更新時間:2025年12月04日 08:59:56 作者:路遠_Programmer
Java Long類型轉JSON時可能因JSON的通用數(shù)字類型不指定位數(shù)大小及JavaScript整數(shù)表達精度限制導致精度丟失,解決方法包括在Java對象中為Long類型字段添加@JsonFormat(shape=JsonFormat.Shape.STRING)注解,或在Spring框架中配置ObjectMapper以全局序列化行為
問題分析
Java Long 類型轉為 JSON 時可能出現(xiàn)精度丟失的原因主要包括 JSON 的通用數(shù)字類型不指定位數(shù)大小以及JavaScript 存儲大數(shù)字時的精度限制。
- JSON 的通用數(shù)字類型不指定位數(shù)大小:JSON 作為一種跨平臺的數(shù)據交換格式,其數(shù)字類型是通用的,不指定位數(shù)大小。這意味著在將Java中的Long類型( 64位 有符號整數(shù),范圍從-9,223,372,036,854,775,808到9,223,372,036,854,775,807)序列化為 JSON 字符串時,如果數(shù)字超出了 JSON 能夠精確表示的范圍,就可能導致精度丟失。
- JavaScript 存儲大數(shù)字時的精度限制:在 JavaScript 中,整數(shù)表達存在精度限制,最多能表達的數(shù)字位數(shù)為 15 位。當數(shù)字超過 15 位時,JavaScript會出現(xiàn)精度丟失問題,表現(xiàn)為數(shù)字被截斷或以科學計數(shù)法表示。
- 例如,當 JavaScript 嘗試表示一個超過 15位 的整數(shù)時,最后幾位數(shù)字可能會變?yōu)?,導致精度丟失。
解決方案
- 局部設置:在 Java 對象中,可以為 Long 類型的字段添加
@JsonFormat(shape = JsonFormat.Shape.STRING)注解,這樣在序列化為 JSON 時,Long 類型會 被當作字符串處理,從而避免精度丟失問題。 - 全局設置:在 Spring 框架中,可以通過配置
ObjectMapper來設置全局的序列化行為,例如使用ToStringSerializer來確保 Long 類型被序列化為字符串格式,或者在配置中添加自定義的序列化模塊來處理 Long 類型的序列化。
問題實例
后端

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


解決方法
添加一個全局配置
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 轉 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ù)據中的 id 對上了

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
深度解析Java常量池中的Integer緩沖池和String常量池
為了減少對象重復創(chuàng)建、提升運行時效率,Java 內部提供了兩種重要的優(yōu)化機制Integer 緩沖池(IntegerCache)和 String 常量池(String Pool),本文將深入剖析兩大常量池的底層實現(xiàn)、工作流程、適用范圍,并通過流程圖和代碼示例幫助你徹底掌握2026-05-05
SpringBoot+Vue3實現(xiàn)七牛云大視頻上傳
現(xiàn)代Web應用中文件上傳很重要,本文用Vue.js和Spring Boot實現(xiàn)視頻上傳功能,同時使用七牛云作為存儲服務,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2025-07-07
java中實現(xiàn)對象排序的兩種方法(Comparable,Comparator)
這篇文章主要給大家介紹了關于java中實現(xiàn)對象排序的兩種方法,一種是實現(xiàn)Comparable進行排序,另一種是實現(xiàn)Comparator進行排序,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-12-12

