js 数值 精确运算

声明

基于IEEE754浮点表示法的数字在运算时,都会出现不精确的结果,js、java都遵循IEEE754表示法,所以浮点运算时都会出现问题。

例如0.1+0.2=0.30000000000000004

js 数值 精确运算_第1张图片


js 数值 精确运算_第2张图片


思路

实现精确运算的思路,首先将小数转为整数,然后再做运算。

具体函数

/**
 * js精确运算的思路是转为整数,然后再做运算
 */
/**
 * float 加法
 */
  function floatAdd(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}  
       var m =Math.pow(10,Math.max(r1,r2));
       var m1=Math.pow(10,Math.max(r1,r2)-r1);  
       var m2=Math.pow(10,Math.max(r1,r2)-r2);  
       
       var r1_integer=Number(arg1.toString().replace(".",""))*m1;
       
       var r2_integer=Number(arg2.toString().replace(".",""))*m2;   
       
       
       return (r1_integer+r2_integer)/m;  
  } 
      
  //减法
  function floatSub(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}  
      var m =Math.pow(10,Math.max(r1,r2));
      var m1=Math.pow(10,Math.max(r1,r2)-r1);  
      var m2=Math.pow(10,Math.max(r1,r2)-r2);  
      
      var r1_integer=Number(arg1.toString().replace(".",""))*m1;
      
      var r2_integer=Number(arg2.toString().replace(".",""))*m2;   
      
      n=(r1>=r2)?r1:r2;  
      return Number(((r1_integer-r2_integer)/m).toFixed(n));  
      
  }  
       
  //乘  
  function floatMul(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 floatDiv(arg1,arg2){   
        var t1=0,t2=0,r1,r2;   
        try{t1=arg1.toString().split(".")[1].length}catch(e){}   
        try{t2=arg2.toString().split(".")[1].length}catch(e){}   
        
        r1=Number(arg1.toString().replace(".",""));
   
        r2=Number(arg2.toString().replace(".",""));   
        return (r1/r2)*Math.pow(10,t2-t1);   
  }



你可能感兴趣的:(js 数值 精确运算)