无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網 會員登陸 & 注冊

javascript中如何解決精度丟失問題

2023-09-05 15:07 作者:bengdour  | 我要投稿

在項目開發(fā)中,你一定遇到過精度丟失的問題!比如某個無良的后端返回了一個超16位的數字訂單號,比如0.1+0.2 != 0.3等等:



01

精度丟失的原因

是什么原因造成的捏?

嗯?大道理咱也不會說,問就是一句話回復:

在十進制轉二進制的過程中,因js存儲位數有限制,末位就會0舍1入取近似值,從而導致再轉回十進制時產生誤差。



02

如何解決

  • 使用toPrecision;?

  • 乘以10的N次冪轉換成整數,再除以N次冪轉回小數;

  • 先加上1e-14或Number.EPSILON再取值;

  • 使用第三方庫,處理大數的 bignumber.js,處理小數的number-precision 和 decimal.js,處理JSON序列化json-bigint。

使用toPrecision

這個方法主要用于純展示。先用toPrecision保留一定位數的經度,再通過parseFloat展示。

例如:

這個12是精度默認值或者說是一個經驗值,12位一般都能解決0000...1和0000...9的問題。一般不適合浮點數的運算。


先轉整數進行運算,再轉成小數

這種方式是我之前浮點運算時經常用到的方法。我們拿0.1+0.2的運算來舉例:

但這種方法也不是萬能的,有時候也會失精:

真是防不勝防啊!這時候我們也可以使用Math.round()方法來達到我們的目的,如下:


先加上1e-14或Number.EPSILON再取值

給浮點數加上一個極小的數就可以達到目的。獲取極小的數有兩種方式:

  • 1e-14(10的-14次方)

  • ES6的極小的常量Number.EPSILON


先來看看Number.EPSILON是什么?

這兩種方式都可以,看自己的喜好啦!


第三方庫

第三方庫主要介紹以下四種:

  • bignumber.js的使用-處理大數

安裝:

引入:

使用:

官網:https://mikemcl.github.io/bignumber.js/

  • number-precision的使用-處理小數

安裝:

引入:

使用:


  • number-precision的使用-處理小數

安裝:

引入:

使用:

上面的結果是Decimal 對象,取值需要Number 或 String轉換

官網:http://mikemcl.github.io/decimal.js/


  • json-bigint的使用-處理后端的返回值

安裝:

引入:

使用:

主要是把大數據轉成字符串。其實關于這一點,如果后端經驗豐富的話,自然會給前端返回字符串,也無需前端轉換。不過呢,可能前端的技能的提升也就是從無經驗的后端開始的噢!



javascript中如何解決精度丟失問題的評論 (共 條)

分享到微博請遵守國家法律
澜沧| 水城县| 乡城县| 林州市| 大化| 诸暨市| 临海市| 桐城市| 盐城市| 湄潭县| 宜兰市| 新昌县| 都江堰市| 韶关市| 南皮县| 肥西县| 新巴尔虎右旗| 米易县| 浦城县| 天镇县| 景泰县| 政和县| 从化市| 绍兴市| 泽普县| 松溪县| 公安县| 西昌市| 西华县| 临清市| 丰城市| 河北区| 布拖县| 镇雄县| 原平市| 阜康市| 五台县| 肇源县| 辰溪县| 怀仁县| 瑞丽市|