js中float类型操作出现精确度不一致

最近在做报销管理时遇到float类型的数据在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}
              
      m=Math.pow(10,Math.max(r1,r2))
              
     return (arg1*m+arg2*m)/m
        
   }
一下是对FloatAdd方法是使用;
for(var k=0;k<entity.eamanageDtos.length;k++)
         {
          if(!wisdom.isEmpty(entity.eamanageDtos[k].amount))
          {
           var detailamount=null;
           if(entity.eamanageDtos[k].amount1!=null||entity.eamanageDtos[k].amount1!=undefined)
           {
           detailamount=FloatAdd(entity.eamanageDtos[k].amount1,null);
           }
           if(entity.eamanageDtos[k].amount2!=null||entity.eamanageDtos[k].amount2!=undefined)
           {
           detailamount=FloatAdd(detailamount,entity.eamanageDtos[k].amount2);
           }
           if(entity.eamanageDtos[k].amount3!=null||entity.eamanageDtos[k].amount3!=undefined)
           {
           detailamount=FloatAdd(detailamount,entity.eamanageDtos[k].amount3);
           }
           if(entity.eamanageDtos[k].amount!=detailamount)
           {
            arrAlertMessage.push("管理科目 第"+(k+1)+"行的项目的合计金额必须与其金额数相等!</br>");
           }
        }
  }
还有一种情况就是用prasefloat类型来相除或者相乘,会出现精确度不一致的问题,这里用到的一种解决方案就是先把float转换成整数,相除后再转换成小数,来消除0.6/3的问题;
由于用到math.pow()转化会产生精确度不一致的问题,我这里用了直接截取的方式来实现保留两位小数;
 if(mamountstringaplit.toString().lastIndexOf(".")!=-1)
  {
    mamountstringaplit= mamountstringaplit.toString().substring(0,mamountstringaplit.toString().lastIndexOf(".")+3);
  }
如下0.6/3遇到精确度的问题;
 mamount=mamount*100;
  singleamount=mamount/(entity.projectdtos.length);
  singleamount=singleamount/100;
  mamount=mamount/100;
  var singleam=singleamount;
  if(singleamount.toString().lastIndexOf(".")!=-1)
  {
    singleam=singleamount.toString().substring(0,singleamount.toString().lastIndexOf(".")+3);
  }

你可能感兴趣的:(js中float类型)