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

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-12-13 17:02:13 242觀看
導讀一個詭異的現象在進行數據結構設計時,我們通常需要考慮到相關業務的數據量等因素。比如非核心業務但數據量大并且頻繁寫入的表的主鍵,我們可能會考慮設計為Long類型。剛開始,數據量小,可能并不會發現什么問題。但是當數據

一個詭異的現象

在進行數據結構設計時,我們通常需要考慮到相關業務的數據量等因素。比如非核心業務但數據量大并且頻繁寫入的表的主鍵,我們可能會考慮設計為Long類型。剛開始,數據量小,可能并不會發現什么問題。但是當數據量大了,或者Id采用雪花算法生成,這個時候詭異的事情便會發生。AhD28資訊網——每日最新資訊28at.com

后端數據正常返回,postman調試看數據也正常。但是當前端用后端返回的這個id查詢相應的數據時,便會發生詭異的NotFoundException,或者查詢的出來的數據和原先的數據不一致。AhD28資訊網——每日最新資訊28at.com

所以,誰偷偷動了我的代碼?AhD28資訊網——每日最新資訊28at.com

AhD28資訊網——每日最新資訊28at.com

JavaScript的數值精度

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

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

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

AhD28資訊網——每日最新資訊28at.com

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

一個簡單的解決辦法

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

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

前端獲取到的是string類型的數據,自然也不會有精度丟失的問題了。AhD28資訊網——每日最新資訊28at.com

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

# 默認為falsespring.jackson.seralization.WRITE_NUMBER_AS_STRINGS=true

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

總結

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

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

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

上一篇: 現代軟件架構:事件驅動設計遇上事件溯源

下一篇: Python進階指南,惰性求值,lambda表達式

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 明水县| 得荣县| 油尖旺区| 正蓝旗| 筠连县| 治多县| 烟台市| 万载县| 青田县| 广宗县| 大邑县| 大冶市| 肇源县| 拜城县| 绵阳市| 拉萨市| 大悟县| 天柱县| 福泉市| 娱乐| 休宁县| 澄城县| 务川| 株洲县| 越西县| 巨鹿县| 丰宁| 晋州市| 塘沽区| 浙江省| 砀山县| 柳河县| 舟山市| 昌图县| 台前县| 巢湖市| 康马县| 崇仁县| 航空| 西峡县| 洪洞县|