JS之浮點數精度丟失問題

2021-08-02 20:26:52 字數 2068 閱讀 3060

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,使用小...