js計算不准確 解決方案


作為前端首先要明白一點,在某些時候js的計算是不准確的,簡單的比如:0.1+0.2.

因為js使用的是雙精度浮點數來計算的(具體是啥我也不知道,大概就是二進制),0.1,0.2這樣的仔二進制中相當於1/3這樣的無限小數。

簡單來講對於js計算來說,整數的計算是沒問題的,但是關於小數位的計算就會出現精度丟失的問題。

那么解決方案來了:把小數轉換為整數來進行計算。

(當然了也可以引入很多計算庫,比如我使用的就是 mathjs)

var [a,b] = [0.1,0.2];//定義兩個變量

首先,我們需要判斷是否是帶有小數點:

var [a1,b1] = [0,0]
try{a1 = (a*1).toString().split('.')[1].length}catch{a1=0}
try{b1 = (b*1).toString().split('.')[1].length}catch{b1=0}
//此處是獲取兩個數據里面的小數的位數
//此處之所以 *1是為了避免我們一時疏忽傳入了字符串類型,*1可以將數字類型的字符串轉換為數字

然后,就是把數據轉換為整數了:

var c = Math.pow(10,Math.max(a1,b1));
//這個是獲取兩個位數中最大的小數位數,並且返回10的n次冪

var d = (a*1*c) + (b*1*c);
//此時計算的是整數相加的結果,還不是最后結果

var e = d /c;
//將整數結果除去10的n次冪,得到的就是最終結果

最后,完整代碼:

 
var [a,b] = [0.1,0.2];

var [a1,b1] = [0,0]
try{a1 = (a*1).toString().split('.')[1].length}catch{a1=0}
try{b1 = (b*1).toString().split('.')[1].length}catch{b1=0}
var c = Math.pow(10,Math.max(a1,b1));
var e = ((a*1*c) + (b*1*c))/c;
//e:0.3

減、乘、除與加類似,就不多贅述啦。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM