JAVA中關(guān)于Long類型返回前端精度丟失問題處理辦法
問題出現(xiàn):
新項(xiàng)目將后端的Java Bean的id屬性是用的Long類型對(duì)應(yīng)數(shù)據(jù)庫主鍵使用bigint類型,id改為雪花后出現(xiàn)的異常問題,比如id:1799633456368132098返回錯(cuò)誤的id:1799633456368132000。導(dǎo)致明顯問題數(shù)值精度丟失。后三位數(shù)值轉(zhuǎn)換為0了。
問題原因:
Java中的long能表示的范圍比js中number大,也就意味著部分?jǐn)?shù)值在js中存不下(變成不準(zhǔn)確的值),導(dǎo)致Id最后幾位直接變成了0。

解決方案一
1、將后端id字段類型換位字符串類型,并且前端以字符串的方式接收就不會(huì)有精度丟失了。
2、單個(gè)字段注釋,這只需要我們?cè)谛枰D(zhuǎn)換的字段上增加@JsonSerialize(using=ToStringSerializer.class)注解
解決方案二
SpringBoot使用Jackson序列化方式
需要引入依賴 <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
package com.znkj.nvm.common.config;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;
/**
* jackson 配置
* 加載順序:-10000
**/
@Slf4j
@Order(-10000)
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> {
// 全局配置序列化返回 JSON 處理
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE);
javaTimeModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
builder.modules(javaTimeModule);
builder.timeZone(TimeZone.getDefault());
log.info("初始化 jackson 配置");
};
}
}package com.gyq.common.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
import com.fasterxml.jackson.databind.ser.std.NumberSerializer;
import java.io.IOException;
/**
* 超出 JS 最大最小值 處理
**/
@JacksonStdImpl
public class BigNumberSerializer extends NumberSerializer {
/**
* 根據(jù) JS Number.MAX_SAFE_INTEGER 與 Number.MIN_SAFE_INTEGER 得來
*/
private static final long MAX_SAFE_INTEGER = 9007199254740991L;
private static final long MIN_SAFE_INTEGER = -9007199254740991L;
/**
* 提供實(shí)例
*/
public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class);
public BigNumberSerializer(Class<? extends Number> rawType) {
super(rawType);
}
@Override
public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException {
// 超出范圍 序列化位字符串
if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) {
super.serialize(value, gen, provider);
} else {
gen.writeString(value.toString());
}
}
}總結(jié)
到此這篇關(guān)于JAVA中關(guān)于Long類型返回前端精度丟失問題處理辦法的文章就介紹到這了,更多相關(guān)JAVA Long類型返回前端精度丟失內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot使用webservice發(fā)布和調(diào)用接口的實(shí)例詳解
本文介紹了如何在Springboot中使用webservice發(fā)布和調(diào)用接口,涵蓋了必要的依賴添加和代碼示例,文中提供了服務(wù)端和客戶端的實(shí)現(xiàn)方法,以及如何設(shè)置端口和服務(wù)地址,幫助讀者更好地理解和應(yīng)用Springboot結(jié)合webservice的技術(shù)2024-10-10
使用MyBatis TypeHandler實(shí)現(xiàn)數(shù)據(jù)加密與解密的具體方案
在我們?nèi)粘5拈_發(fā)工作中,經(jīng)常會(huì)遇到一些敏感數(shù)據(jù)需要存儲(chǔ),比如用戶的手機(jī)號(hào)、身份證號(hào)、銀行卡號(hào)等,為了保障數(shù)據(jù)安全,我們通常會(huì)對(duì)這些敏感信息進(jìn)行加密后再存入數(shù)據(jù)庫,所以本文給大家介紹了如何使用MyBatis TypeHandler實(shí)現(xiàn)數(shù)據(jù)加密與解密,需要的朋友可以參考下2025-11-11
Java注解@Conditional與@Profile的使用區(qū)別
這篇文章主要介紹了Java注解@Conditional與@Profile的使用區(qū)別,@Profile和@Conditional是Spring提供的兩種常用機(jī)制,它們可以根據(jù)不同的條件動(dòng)態(tài)決定某些Bean是否加載,從而實(shí)現(xiàn)環(huán)境隔離、模塊選擇、特性開關(guān)等功能,需要的朋友可以參考下2025-05-05
Java synchronized關(guān)鍵字從入門到原理解析
這篇文章介紹Java synchronized關(guān)鍵字從入門到原理,本課程適合具備Java基礎(chǔ)語法知識(shí),初步了解多線程概念但尚未系統(tǒng)學(xué)習(xí)并發(fā)編程的開發(fā)者,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2026-02-02
在Spring Boot項(xiàng)目中引入本地JAR包的步驟和配置
本文探討了在Spring Boot項(xiàng)目中引入本地JAR包的步驟和必要的配置,通過使用Maven的system作用域,開發(fā)者可以將自定義的本地庫或功能集成到Spring Boot應(yīng)用程序中,,需要的朋友可以參考下2023-10-10
Spring?RestTemplate遠(yuǎn)程調(diào)用過程
這篇文章主要介紹了Spring?RestTemplate遠(yuǎn)程調(diào)用過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
SpringMVC五大組件與執(zhí)行原理分析總結(jié)
這篇文章主要介紹了SpringMVC五大組件與執(zhí)行原理分析總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
Spring框架運(yùn)用了多種設(shè)計(jì)模式方式
Spring框架廣泛采用設(shè)計(jì)模式,如工廠模式(BeanFactory)、單例模式、代理模式(AOP)、模板方法模式(JdbcTemplate)等,以實(shí)現(xiàn)高內(nèi)聚、低耦合、可擴(kuò)展和易維護(hù)的架構(gòu),支撐IoC、AOP和MVC等核心特性2025-08-08

