當前位置:首頁 » 網頁前端 » 前端怎麼能不丟精度
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

前端怎麼能不丟精度

發布時間: 2022-05-17 00:00:37

⑴ 怎麼將long類型轉換為string類型

一、問題描述
最近在改造內部管理系統的時候, 發現了一個巨坑,就是前端 JS 在獲取後端 Long 型參數時,出現精度丟失!

起初,用 postman 模擬介面請求,都很正常,但是用瀏覽器請求的時候,就出現問題了!

問題復現

打開瀏覽器,請求介面,結果如下!

用 postman 模擬介面請求,結果如下!

剛開始的時候,還真沒發現這個坑,結果當進行測試的時候,才發現前端傳給後端的ID,與資料庫中存的ID不一致,才發現 JavaScript 還有這個天坑!

由於 JavaScript 中 Number 類型的自身原因,並不能完全表示 Long 型的數字,在 Long 長度大於17位時會出現精度丟失的問題。

當我們把上面的用戶 ID 改成 19 位的時候,我們再來看看瀏覽器請求返回的結果。

瀏覽器請求結果!

當返回的結果超過17位的時候,後面的全部變成0!

二、解決辦法
遇到這種情況,應該怎麼辦呢?

第一種辦法:在後台把 long 型改為String類型,但是代價有點大,只要涉及到的地方都需要改
第二種辦法:使用工具進行轉化把 long 型改為String類型,這種方法可以實現全局轉化(推薦)
第三種辦法:前端進行處理(目前沒有很好的辦法,不推薦)
因為項目涉及到的代碼非常多,所以不可能把 long 型改為 String 類型,而且使用 Long 類型的方法非常多,改起來風險非常大,所以不推薦使用!

最理想的方法,就是使用aop代理攔截所有的方法,對返回參數進行統一處理,使用工具進行轉化,過程如下!

2.1、Jackson 工具序列化對象
我們可以使用Jackson工具包來實現對象序列化。

首先在 maven 中添加必須的依賴

編寫一個轉化工具類JsonUtil

緊接著,編寫一個實體類Person,用於測試

最後,我們編寫一個測試類測試一下效果

輸出結果如下:

其中最關鍵一行代碼,是注冊了這個轉換類,從而實現將所有的 long 變成 string。

如果想對某個日期進行格式化,可以全局設置。

也可以,單獨對某個屬性進行設置,例如對createTime屬性格式化為yyyy-MM-dd,只需要加上如下註解即可。

工具轉化類寫好之後,就非常簡單了,只需要對 aop 攔截的方法返回的參數,進行序列化就可以自動實現將所有的 long 變成 string。

2.2、SpringMVC 配置
如果是 SpringMVC 項目,操作也很簡單。

自定義一個實現類,繼承自ObjectMapper

在 SpringMVC 的配置文件中加上如下配置

2.3、SpringBoot 配置
如果是 SpringBoot 項目,操作也類似。

編寫一個WebConfig配置類,並實現自WebMvcConfigurer,重寫configureMessageConverters方法

三、總結
在實際的項目開發中,很多服務都是純微服務開發,沒有用到SpringMVC,在這種情況下,使用JsonUtil工具類實現對象序列化,可能是一個非常好的選擇。

⑵ 如何用JavaScript打造0.1%精度的進度條

單進圖條模式需要進度條長度為1000px的整數倍,
多進度條模式方法就多了,以兩根進度條為例來表達的話可以第一根進度條表示1/100的精度,只要長度為100px的整數倍。第二個進度條的精度為1/10,長度需要為10px的整數倍。動畫效果為第二根進度條滿了第一根進度條進度加1就好了,這樣組合起來就可以達到表示1/1000精度的效果。
當然,如果布局有限制直接將值表示在進度條上就行了,前端基本沒有多少會刻意的要求動畫精度吧。

⑶ Java中數據類型高位轉地位怎麼才不會損失精度

當然會丟失精度,float精度7位。
但double消耗內存是float的兩倍,double的運算速度比float慢得多,java語言中數學函數名稱double 和 float不同,不要寫錯,能用單精度時不要用雙精度(以省內存,加快運算速度)

⑷ C語言中,float轉化為double怎麼樣做才能不丟精度

用強制轉換即可
(double)變數名 字母小寫

⑸ warning: converting to `int' from `double'怎麼使輸出結果不丟失精度

sizeof(double)
=
8;
sizeof(int)
=
4;
從8位轉換成4位肯定丟失一些信息,所以會有警告,但不是錯誤。
如果強制轉換可以用
a
=
(int)c;

⑹ 下列選項中,使用什麼數據類型保存3.141可以不丟失精度

摘要 沒有發選項。

⑺ JavaScript為什麼浮點數會丟失精度

JS浮點計算問題

問題

用js進行浮點數計算,結果可能會「超出預期」,大部分計算結果還是對的,但是我們可不想在計算這么嚴謹的事情上還有意外的驚喜。比如:

  • 0.3 + 0.6 = 0.8999999999999999

  • 0.3 - 0.2 = 0.09999999999999998

  • 0.3 * 1.5 = 0.44999999999999996

  • 0.3 / 0.1 = 2.9999999999999996

  • 看完這幾個計算結果,如果你沒用過js,你可能會有點崩潰。我只能說,這就是js的魅力所在。

    分析

    在這之前,你需要知道以下幾點:

  • js中數字類型只有Number;

  • js的Number是IEEE 754標準的64-bits的雙精度數值

  • 網上有很多關於此問題的解釋,由於計算機是用二進制來存儲和處理數字,不能精確表示浮點數,而js中沒有相應的封裝類來處理浮點數運算,直接計算會導致運算精度丟失。其實高級語言(c#,java)也存在此問題,只不過它們自己內部做了處理,把這種精度差異給屏蔽掉了。有些小數轉換為二進制位數是無窮的(有循環),但是64位中小數最多隻有52位,因此對於位數超過的相當於被截取了,導致了精度的丟失。這個地址可以用來浮點數和IEEE 754標準的64-bits的互轉(背後是二進制的轉換),用這個我們來驗證下0.3-0.2。

  • 0.3轉換後為0.

  • 0.2轉換後為0.

  • 0.-0.=0.

  • 這和js直接計算的結果0.09999999999999998想吻合。

    分析下來,終於明白並不是js自身發育不良,只是沒有及時補充營養,我們只能另想出路了。

以上是網上找的

我以前遇到過問題2中瀏覽器計算的結果 是兩種,所以和瀏覽器也有問題

⑻ 前端開發需要掌握哪些技術才能達到實習生水平

需要掌握HTML、CSS、JavaScript、主流框架與開發工具:

  • HTML+CSS屬於結構與樣式,用來實現靜態的前端網頁(PC端與移動端網頁);

  • JavaScript是屬於腳本語言,用於實現前端網頁的交互效果;

  • 運用jQuery、Zepto、Swiper等前端框架進行快速開發。