作為前端首先要明白一點,在某些時候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
減、乘、除與加類似,就不多贅述啦。