解决:js换算百分比的总和相加不为100%的问题

2018-11-14    分类: jquery制作,前端资源

js 相加 相减 结果 余数

做项目时候,后台会提供一段数据,前端需要把数据转换成百分之,即是把单个值除以它们的总和,但是每个值按照这样的思路计算后发现有可能换算成的百分值在相加并不等于100%。

如下图:

每个百分比的值相加只等于98%,这结果是不合理的。

 

解决思路就是:把剩下最后一个大于0的值用100减去前几个百分比的总和。

如下图:

为了减少误差,保留了2位小数。

 

注意js在进行加减运算时,可能会有点问题,如:

0.2+0.3=0.500000001 //正确应该是0.5

或者

100-51.12=48.8799999 //正确应该是48.88

遇到这种问题我一般解决方法是:

例如  (Math.round( (100-51.12)*100 ))/100  //结果就是48.88

 

最终封装方法

per_arry([0,0,0,0,0,42.32,1]);  //传入要转化为百分比的数组

function per_arry(arry) {
  var lenders_age_arry=arry;
  var lenders_tol=0;

  var gt_zero=0 ;//判断几个值大于0
  var res_arry=[]; //最终结果

  var last_gt_index=0; //存放最后一个大于0的值所在的索引
  var befor_num_sum=0; //除最后一个,将之前大于0的百分值相加
  $(lenders_age_arry).each(function (index,value) {
     if( value>0 ){
       gt_zero++;
       last_gt_index=index;
       lenders_tol=lenders_tol+parseFloat(value);
     }
  });


  if(gt_zero==0 || gt_zero==1){ //全值都是0 或者 只有一个值时
     res_arry=lenders_age_arry;
  }

  if(gt_zero>1){

    $(lenders_age_arry).each(function (index,value) {
      if( value>0 ){
        if(last_gt_index==index){
           res_arry.push( (Math.round((100-befor_num_sum)*100))/100 ) ;
        }else{
           res_arry.push( Math.round(parseFloat((value/lenders_tol)*10000))/100 ) ;
           befor_num_sum=befor_num_sum+ (Math.round(parseFloat((value/lenders_tol)*10000))/100);
        }
      }else{
        res_arry.push(0) ;
      }
    });

  }

  return res_arry;
 }