java解決雪花ID在前端精度丟失問題
在現(xiàn)代分布式系統(tǒng)中,雪花算法(Snowflake)被廣泛用于生成唯一的ID。這些ID通常是Long類型的整數(shù)。然而,當(dāng)這些ID從后端傳遞到前端時(shí),JavaScript的精度限制可能會(huì)導(dǎo)致精度丟失,特別是ID的后三位無法正確表示。本文將探討這一問題的原因,并提供三種解決方案。
問題背景
在后端,雪花算法生成的ID是一個(gè)64位的Long類型整數(shù)。例如:
private Long id = 1511972392982179840L;
然而,當(dāng)這個(gè)ID傳遞到前端時(shí),JavaScript的Number類型無法精確表示如此大的整數(shù)。JavaScript的Number類型使用雙精度浮點(diǎn)數(shù)表示,其有效精度范圍是 (-2^{53}) 到 (2^{53})(不包含邊界)。因此,當(dāng)ID超過這個(gè)范圍時(shí),精度就會(huì)丟失。例如:
let id = 1511972392982179840; // 實(shí)際表示為 1511972392982179800
解決方案
方案一:使用Jackson注解
在后端,可以通過Jackson庫將Long類型的ID轉(zhuǎn)換為String類型,從而避免精度丟失。具體實(shí)現(xiàn)如下:
- 在VO類中,使用@JsonFormat注解將Long類型的ID序列化為String:
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; public class YourVO { @JsonSerialize(using = ToStringSerializer.class) @JsonFormat(shape = JsonFormat.Shape.STRING) private Long id; // 其他字段和方法 }
- 這樣,后端返回的JSON數(shù)據(jù)中,ID將以字符串形式表示,前端接收時(shí)不會(huì)丟失精度。
方案二:自定義JSON配置類
另一種方法是通過自定義JSON配置類,在全局范圍內(nèi)將Long類型的ID轉(zhuǎn)換為String類型:
- 創(chuàng)建一個(gè)Jackson配置類:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(Long.class, ToStringSerializer.instance); objectMapper.registerModule(module); return objectMapper; } }
- 通過這種方式,所有Long類型的字段在序列化時(shí)都會(huì)自動(dòng)轉(zhuǎn)換為String類型,確保前端接收時(shí)不會(huì)丟失精度。
方案三:在數(shù)據(jù)庫中以String類型存儲(chǔ)
另一種解決方案是在數(shù)據(jù)庫中直接將雪花ID存儲(chǔ)為String類型。這種方法可以從根本上避免精度丟失問題:
- 在數(shù)據(jù)庫表中,將ID字段的類型設(shè)置為VARCHAR:
CREATE TABLE your_table ( snowflake_id VARCHAR(20) NOT NULL, -- 其他字段 );
- 在后端代碼中,確保ID以String類型處理:
public class YourEntity { private String id; // 其他字段和方法 }
- 這樣,ID在整個(gè)傳輸和存儲(chǔ)過程中都以String類型存在,避免了任何精度丟失的問題。
總結(jié)
在處理雪花算法生成的Long類型ID時(shí),前端精度丟失是一個(gè)常見問題。通過使用Jackson注解、自定義JSON配置類或在數(shù)據(jù)庫中以String類型存儲(chǔ),可以有效地解決這一問題,確保ID在前端正確顯示。希望本文能幫助在實(shí)際項(xiàng)目中解決類似問題。
到此這篇關(guān)于java解決雪花ID在前端精度丟失問題的文章就介紹到這了,更多相關(guān)雪花ID在前端精度丟失內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis實(shí)現(xiàn)傳入多個(gè)參數(shù)的四種方法詳細(xì)講解
這篇文章主要介紹了Mybatis實(shí)現(xiàn)傳入多個(gè)參數(shù)的四種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法
本文主要介紹了java序列化對(duì)象根據(jù)不同配置動(dòng)態(tài)改變屬性名的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Java實(shí)現(xiàn)文件壓縮與解壓的示例[zip格式,gzip格式]
本篇文章主要介紹了Java實(shí)現(xiàn)文件壓縮與解壓的示例[zip格式,gzip格式],具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01java 靜態(tài)代理 動(dòng)態(tài)代理深入學(xué)習(xí)
代理模式是常用的java設(shè)計(jì)模式,特征是代理類與委托類有同樣的接口,代理類主要負(fù)責(zé)為委托類預(yù)處理消息、過濾消息、把消息轉(zhuǎn)發(fā)給委托類,以及事后處理消息等,需要的朋友可以參考下2012-11-11Spring Boot 3.x 全新的熱部署配置方式詳解(IntelliJ ID
這篇文章主要介紹了Spring Boot 3.x 全新的熱部署配置方式(IntelliJ IDEA 2023.1),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07java ArrayList.remove()的三種錯(cuò)誤用法以及六種正確用法詳解
這篇文章主要介紹了java ArrayList.remove()的三種錯(cuò)誤用法以及六種正確用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Java移位運(yùn)算符詳解實(shí)例(小結(jié))
這篇文章主要介紹了Java移位運(yùn)算符詳解實(shí)例(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Springboot使用Security實(shí)現(xiàn)OAuth2授權(quán)驗(yàn)證完整過程
安全管理是軟件系統(tǒng)必不可少的的功能。根據(jù)經(jīng)典的“墨菲定律”——凡是可能,總會(huì)發(fā)生。如果系統(tǒng)存在安全隱患,最終必然會(huì)出現(xiàn)問題,這篇文章主要介紹了SpringBoot使用Security實(shí)現(xiàn)OAuth2授權(quán)驗(yàn)證完整過程2022-12-12Java日志相關(guān)技術(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java日志相關(guān)技術(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-07-07