數值計算與開發。
本文介紹在javascript中發生小數計算溢位之解決方法。
在javascript中,有時候小數計算結果會發生異常如下圖:
明明 1.1+1.51+1.00 結果應該是 3.61才對啊
怎麼會是 3.6100000000000003 呢?
為了使你的程式在小數計算這塊不出問題,
我們使用以下的自定義函式來處理小數計算。
原理就是利用先轉字串再做運算處理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
// 浮點數相加 function addFloat(num1,num2){ var r1, r2, m; try{ r1 = num1.toString().split(".")[1].length; }catch(e){ r1 = 0; } try{ r2 = num2.toString().split(".")[1].length; } catch(e){ r2 = 0; } m = Math.pow(10, Math.max(r1, r2)); return (mulFloat(num1, m) + mulFloat(num2, m)) / m; } // 浮點數相減 function subFloat(num1,num2){ var r1, r2, m, n; try{ r1 = num1.toString().split(".")[1].length; }catch(e){ r1 = 0; } try{ r2 = num2.toString().split(".")[1].length; } catch(e){ r2 = 0; } m = Math.pow(10, Math.max(r1, r2)); n = (r1 >= r2) ? r1 : r2; return ((num1 * m - num2 * m) / m).toFixed(n); } // 浮點數相乘 function mulFloat(num1,num2){ var m = 0, s1 = num1.toString(), s2 = num2.toString(); try{ m += s1.split(".")[1].length; }catch(e){ } try{ m += s2.toString().split(".")[1].length; } catch(e){ } return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); } // 浮點數相除 function divFloat(num1,num2){ var r1, r2, t1 = 0, t2 = 0; try{ t1 = num1.toString().split(".")[1].length; }catch(e){ } try{ t2 = num2.toString().split(".")[1].length; } catch(e){ } with(Math){ r1 = Number(num1.toString().replace(".", "")); r2 = Number(num2.toString().replace(".", "")); return (r1 / r2) * pow(10, t2 - t1); } } |
留言