IT虾米网

js 数值 精确运算详解

developer 2021年06月15日 编程语言 236 0

声明

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

例如0.1+0.2=0.30000000000000004





思路

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

具体函数

/** 
 * 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);    
  } 




发布评论
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

linux 添加用户 修改文件所属用户及用户组详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。