js中,在進行浮點數計算的時候,會出現精度丟失的問題,如下:
alert(0.1 + 0.2);
alert(0.3 - 0.2);
alert(0.1 * 0.2);
alert(0.3* 0.2);
正常情況,得出的結果應該是0.3, 0.1, 0.02, 1.5, 但是實際得出的結果卻不是這樣,如下
可以看到,得出的結果並不是我們預期的結果,造成這樣的原因就是浮點數丟失造成的,那麼如何解決呢,通過已有的只是可以解決這個問題,如下:
1. 既然是浮點數進行加法運算造成的精度丟失,那麼可不可以考慮換算成整數計算,再除以相同小數字呢
2. 獲取小數字的長度,number.tostring().split('.')[1].length
3. 進行冪運算, math.pow(10, math.max(num1, num2))
4. 對進行算的數進行取整,再除以長度較大的冪次方
function accadd(num1, num2)catch(e)
trycatch(e)
m = math.pow(10, math.max(r1, r2));//取較大的小數字長度進行冪運算
return math.round(num1*m + num2*m)/m;//將小數字轉化成整數,再進行除法
}alert(accadd(0.1, 0.2));
這樣進行計算後,便可解決精度丟失問題
減法同加法的類似
function accsub(num1, num2)catch(e)
trycatch(e)
m = math.pow(10, math.max(r1, r2));//取較大的小數字長度進行冪運算
return math.round(num1*m - num2*m)/m.tofixed( (r1>= r2) ? r1 : r2 )
;//將小數字轉化成整數,再進行除法
}alert(accsub(0.3, 0.2));
1. 乘法的情況和加減法不同,因為浮點數相乘的結果,小數字的長度為兩浮點數小數字之和,所以方法就不同
2. 獲取兩個浮點數的小數字長度之和
3. 將兩數的轉化為字串去掉小數點,再強轉成整數進行計算
function accmul(num1, num2)catch(e){}
trycatch(e){}
//將num1和num2轉化為字串,去掉小數點,再強轉成整數進行計算
return number(s1.replace('.', ''))*number(s2.replace('.',''))/math.pow(10, m);
}alert(accmul(0.1, 0.2));
思想類似,使用方法用到之前部落格所講的arguments物件
程式:number.prototype.rate=function()
function tran()
for(var i=0;i temp /= args[i].rate();
}return temp;
}alert(tran(0.1, 0.2));
分析: 和乘法類似
function accdiv(num1, num2)catch(e)
trycatch(e)
return number(s1.replace('.',''))/number(s2.replace('.',''))*math.pow(10, r2-r1);
}alert(accdiv(0.3, 0.2));
這就是解決浮點數精度丟失問題的辦法,當然還有其他方法,核心思想其實就是轉化為整數運算,再除以成小數字。
浮點數精度丟失問題
c 中的浮點數,分單精度 float 和雙精度 double float 是 system.single 的別名,介於 3.402823e38 和 3.402823e38 之間的32位數字,符合二進位制浮點演算法的 iec 60559 1989 ieee 754 標準 double 是 system...
js浮點數相乘精度丟失的問題
在用vue做專案時,需要以百分比的形式保留兩位小數,展示在頁面上,但遇到了乙個問題 var num data5 data4 data5 data6 tofixed 2 100 npm i decimal.js3.在專案中引入 import decimal from decimal.js 4.解決上述...
浮點數的運算精度丟失
開啟python編譯器,輸入0.1 0.2,期待的結果是0.3,但是輸出為 0.30000000000000004 有點小尷尬,這是為什麼呢?其實這設計到了計算機的浮點數儲存是以二進位制進行儲存的。說二進位制不太形象,換成我們最長使用的十進位制和分數 1 5,使用小數表示為0.2,但是1 3,使用小...