javascript 計算後結果失精度的問題解決

  

  近日,項目中遇到數值通過數學計算後出現失精度的問題,例如:0.35/10 = 0.034999999999999996。形成這一結果的緣由就再也不仔細分析了,太繁瑣,時間緊也就沒仔細去研究。直接說解決方案。函數

  解決方案也是來自網友的分享,大同小異,有擴展Number,給Number增長方法的,也有定義工具方法的。我採用的是擴展Number 的方式。代碼以下:工具

 // 解決四維運算,js計算失去精度的問題
 //加法
 Number.prototype.add = function(arg){
      var r1,r2,m;
      try{r1=this.toString().split(".")[1].length}catch(e){r1=0}
      try{r2=arg.toString().split(".")[1].length}catch(e){r2=0}
      m=Math.pow(10,Math.max(r1,r2))
      return (this*m+arg*m)/m
 };
 //減法
 Number.prototype.sub = function (arg){
     return this.add(-arg);
 };
 //乘法
 Number.prototype.mul = function (arg){
     var m=0,s1=this.toString(),s2=arg.toString();
     try{m+=s1.split(".")[1].length}catch(e){}
     try{m+=s2.split(".")[1].length}catch(e){}
  
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m) }; //除法 Number.prototype.div = function (arg){ var t1=0,t2=0,t3=0,r1,r2; try{t1=this.toString().split(".")[1].length}catch(e){} try{t2=arg.toString().split(".")[1].length}catch(e){} try{t3=arg.toString().split(".")[0].length}catch(e){} with(Math){ if(this > 1 && (t2 === 0 && arg === pow(10,t3-1))){ return this/arg; }else { r1=Number(this.toString().replace(".","")) r2=Number(arg.toString().replace(".","")) return (r1/r2).mul(pow(10,t2-t1)); } } };

  其中,網友分享出來的方法中除法本來只有 else 中的內容,但實際使用過程當中發如今處理相似於 3.5/10 的時候仍會出現結果失精度的問題,因此擅自添加了個 if 判斷。若有其餘更好更全面的解決方式,請廣大網友不吝留言告知。
this

  

  另,附上自定義函數的解決方式:spa

//除法
function accDiv(arg1, arg2) {

    var t1 = 0, t2 = 0, t3 = 0, r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length
    } catch (e) {
    }
    try {
        t2 = arg2.toString().split(".")[1].length
        t3 = arg2.toString().split(".")[0].length
    } catch (e) {
    }
    r1 = Number(arg1.toString().replace(".", ""))
    r2 = Number(arg2.toString().replace(".", ""))
    if (arg1 > 1 && (t2 === 0 && arg2 === Math.pow(10, t3 - 1))) {
        return arg1 / arg2;
    } else {
        r1 = Number(arg1.toString().replace(".", ""))
        r2 = Number(arg2.toString().replace(".", ""))
        return accMul((r1 / r2), Math.pow(10, t2 - t1))
    }
}
//乘法
function accMul(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length
    } catch (e) {
    }
    try {
        m += s2.split(".")[1].length
    } catch (e) {
    }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}
//加法
function accAdd(arg1, arg2) {
    var r1, r2, m;
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch (e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch (e) {
        r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m + arg2 * m) / m
}
//減法
function Subtr(arg1, arg2) {
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch (e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch (e) {
        r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2));
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}
相關文章
相關標籤/搜索