日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

誰動了我的代碼——Long精度丟失

來源: 責(zé)編: 時間:2023-12-13 17:02:13 263觀看
導(dǎo)讀一個詭異的現(xiàn)象在進(jìn)行數(shù)據(jù)結(jié)構(gòu)設(shè)計時,我們通常需要考慮到相關(guān)業(yè)務(wù)的數(shù)據(jù)量等因素。比如非核心業(yè)務(wù)但數(shù)據(jù)量大并且頻繁寫入的表的主鍵,我們可能會考慮設(shè)計為Long類型。剛開始,數(shù)據(jù)量小,可能并不會發(fā)現(xiàn)什么問題。但是當(dāng)數(shù)據(jù)

一個詭異的現(xiàn)象

在進(jìn)行數(shù)據(jù)結(jié)構(gòu)設(shè)計時,我們通常需要考慮到相關(guān)業(yè)務(wù)的數(shù)據(jù)量等因素。比如非核心業(yè)務(wù)但數(shù)據(jù)量大并且頻繁寫入的表的主鍵,我們可能會考慮設(shè)計為Long類型。剛開始,數(shù)據(jù)量小,可能并不會發(fā)現(xiàn)什么問題。但是當(dāng)數(shù)據(jù)量大了,或者Id采用雪花算法生成,這個時候詭異的事情便會發(fā)生。bwL28資訊網(wǎng)——每日最新資訊28at.com

后端數(shù)據(jù)正常返回,postman調(diào)試看數(shù)據(jù)也正常。但是當(dāng)前端用后端返回的這個id查詢相應(yīng)的數(shù)據(jù)時,便會發(fā)生詭異的NotFoundException,或者查詢的出來的數(shù)據(jù)和原先的數(shù)據(jù)不一致。bwL28資訊網(wǎng)——每日最新資訊28at.com

所以,誰偷偷動了我的代碼?bwL28資訊網(wǎng)——每日最新資訊28at.com

bwL28資訊網(wǎng)——每日最新資訊28at.com

JavaScript的數(shù)值精度

如果只從后端分析問題,或者只從前端分析問題,那永遠(yuǎn)也找不到答案。bwL28資訊網(wǎng)——每日最新資訊28at.com

在 JavaScript 中,數(shù)值類型默認(rèn)會被轉(zhuǎn)換為雙精度浮點數(shù),而雙精度浮點數(shù)的精度有限,只能精確表示 2 的 53 次方以內(nèi)(即 Number.MAX_SAFE_INTEGER,約為 9 x 10^15)的整數(shù)。對于超過該范圍的長整數(shù),JavaScript 會發(fā)生精度丟失,導(dǎo)致值變得不準(zhǔn)確。bwL28資訊網(wǎng)——每日最新資訊28at.com

例如一個雪花算法生成的ID 1734042308679487490,前端獲取到的值卻變成了1734042308679487500bwL28資訊網(wǎng)——每日最新資訊28at.com

bwL28資訊網(wǎng)——每日最新資訊28at.com

知道了問題的原因,問題就容易解決了——將Long類型作為String類型返回給前端即可。bwL28資訊網(wǎng)——每日最新資訊28at.com

一個簡單的解決辦法

(1) Spring Boot 中提供了 @JsonFormat 注解,可以對實體類中的屬性進(jìn)行序列化和反序列化格式化。對于 Long 類型的屬性,可以設(shè)置其格式為字符串類型,并在前端進(jìn)行相應(yīng)的處理,以保持其精度不丟失。如:bwL28資訊網(wǎng)——每日最新資訊28at.com

public class Order {  @JsonFormat(shape = JsonFormat.Shape.STRING)  private Long id;  ...}

前端獲取到的是string類型的數(shù)據(jù),自然也不會有精度丟失的問題了。bwL28資訊網(wǎng)——每日最新資訊28at.com

(2) SpringBoot也支持在通過配置文件在項目級別,將數(shù)值類型的數(shù)據(jù)轉(zhuǎn)成字符串返回給前端,通過在 application.properties 文件中添加配置即可:bwL28資訊網(wǎng)——每日最新資訊28at.com

# 默認(rèn)為falsespring.jackson.seralization.WRITE_NUMBER_AS_STRINGS=true

(3) 如果不想使用 @JsonFormat 注解或者項目不是基于SpringBoot框架構(gòu)建的,同樣的思路,直接將Long類型轉(zhuǎn)換成String返回給前端即可。bwL28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

在 JavaScript 中數(shù)值類型最大精度大約為9*10^15,即超過16位的數(shù)值一定會存在精度丟失問題。因此,后端返回Long類型的數(shù)值時,需要轉(zhuǎn)換成String給到前端。bwL28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-44400-0.html誰動了我的代碼——Long精度丟失

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 現(xiàn)代軟件架構(gòu):事件驅(qū)動設(shè)計遇上事件溯源

下一篇: Python進(jìn)階指南,惰性求值,lambda表達(dá)式

標(biāo)簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 囊谦县| 府谷县| 罗山县| 南昌县| 谢通门县| 安丘市| 额敏县| 桐柏县| 新兴县| 治县。| 敦化市| 科尔| 留坝县| 乐平市| 通山县| 方正县| 江安县| 永和县| 绥化市| 沙洋县| 新营市| 阿巴嘎旗| 奈曼旗| 乐安县| 隆安县| 兖州市| 鸡东县| 呼伦贝尔市| 平昌县| 嘉黎县| 三亚市| 光山县| 芜湖县| 珲春市| 秦安县| 巴林左旗| 盐津县| 托克托县| 普格县| 虎林市| 永福县|