js計算小數精度問題


js進行部分小數運算時,會出現精度問題。

 

 

 解決思路是,把小數同時擴大為10的x冪,返回計算完畢后,再縮小為10的x冪。

在Math方法上添加加減乘除方法。

let extentFns = ['add', 'sub', 'mul', 'div'];
//運算函數
function ufunc(type, arg){
  var decimalDigits = []; //要計算的小數位數數組
  //獲取小數點的位數
  for(let index in arg){
    let digit = 0;
    try {  
      digit = arg[index].toString().split(".")[1].length;
    }catch (e) { 
      digit = 0; 
    }
    decimalDigits.push(digit);
  }
  //找到最大的位數
  decimalDigits.sort( (a, b)=> a - b );
  let maxDigit = decimalDigits[decimalDigits.length - 1];
  let m = Math.pow(10, maxDigit);//小數轉換成整數需要擴大的倍數
  let result = 0;
  switch(type){
    case 'add':
      for(let index in arg){
        result += arg[index] * m;
      }
      return result / m;
      break;
    case 'sub':
      for(let index in arg){
        if(index == 0){
          result = arg[index] * m - result;
        }else{
          result -= arg[index] * m
        }       
      }
      return result / m;
      break;
    case 'mul':
      result = 1;
      for(let index in arg){
        if(index == 0){
          result = arg[index] * m * result;
        }else{
          result *= arg[index] * m
        }       
      }
      return result / m;
      break;
    case 'div':
      result = 1;
      for(let index in arg){
        if(index == 0){
          result = arg[index] * m / result;
        }else{
          result /= arg[index] * m
        }       
      }
      return result / m;
      break;
    default:
      break;
      
  }
}
Math.ufunc = ufunc;

//掛載到Math上
// Math.add1 = add1;
for(let i = 0; i < extentFns.length; i++){
  Math[extentFns[i]] = function(){
    return this.ufunc(extentFns[i], arguments);
  };
}
//參數可以連續傳遞 Math.add(0.1, 0.2, 0.3, ....);
console.log( Math.add(0.1,0.2)); //0.3
console.log( Math.sub(0.12,0.2));
console.log( Math.mul(0.2,0.4));
console.log( Math.div(0.2,0.04));

想使用時引入這個js文件即可在Math方法上找到這幾個函數了。

參考:https://blog.csdn.net/caiminiu/article/details/87071668


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM