javascript中如何解決精度丟失問題
在項目開發(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的使用-處理后端的返回值
安裝:
引入:
使用:
主要是把大數據轉成字符串。其實關于這一點,如果后端經驗豐富的話,自然會給前端返回字符串,也無需前端轉換。不過呢,可能前端的技能的提升也就是從無經驗的后端開始的噢!