解决:多种类型占比之和不为1

1.场景
 
对于多种类型占比,不管怎样,占比之和肯定是等于1
 
 
但我们用sql计算的时候,经常是保留两位小数,就会造成占比之和不等于1的情况
 
 
2.解决思路
 
1.有且仅需要重写某个比率不为0的值 
2.需要找出比率不为0的项目名 
3.需要计算其余类型的比率之和
 
3.解决
 
根据上述解决思路,重新计算map即可
 
注意事项:1.map项不确定有几个也可以  2.map项只放各种类型的占比,其余多的项不要放进来,否则会造成计算出错情况 3.map项必须有一项之和不是0
 
package com.techvalley.djys.api.util;
 
 
import lombok.extern.slf4j.Slf4j;
 
 
import java.math.BigDecimal;
import java.util.Map;
 
 
/**
* @author ejQiu
*/
@Slf4j
public class CommonUtil {
 
 
    /**
     * 占比之和等于1
     * //remark:该方法所传map,必须是只包含计算项的,不包含计算项的传递进来,会使计算出错
     */
    public static Map<String, Double> countRateForHundred(Map<String, Double> map){
        //remark(思路):1.有且仅需要重写某个比率不为0的值 2.需要找出比率不为0的项目名 3.需要计算其余类型的比率之和
        //其余之和
        Double otherRate = 0.00;
        //该项不需要计算
        boolean  notNeedCount = true;
        //需要覆盖的key选项
        String coverKey = null;
        for (Map.Entry<String, Double> entry : map.entrySet()) {
            Double value = entry.getValue();
            if(value!=0&&notNeedCount){
                //remark:1.第一次找到比率不为0的项目名,使第一次不计算为false
                notNeedCount = false;
                coverKey = entry.getKey();
            }else {
                otherRate = new BigDecimal(otherRate.toString()).add(new BigDecimal(value.toString())).doubleValue();
            }
        }
        log.info("比率不为0的项目名:{},其余项之和:{}",coverKey,otherRate);
        //覆盖项比例
        double coverKeyRate = new BigDecimal("100").subtract(new BigDecimal(otherRate.toString())).doubleValue();
        map.put(coverKey,coverKeyRate);
        return map;
    }
}

  

 
4.测试类与测试结果
 
package com.techvalley.djys.api.javase;
 
 
import com.techvalley.djys.api.util.CommonUtil;
import com.techvalley.djys.api.util.ExcelUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
 
 
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
 
 
/**
* @author ejQiu
*/
@Slf4j
@SpringBootTest
public class CommonUtilTest {
 
 
    @Test
    public void countRateForHundredTest() throws Exception{
        Map<String,Double> rateMap = new HashMap<>();
        rateMap.put("keji_approved_amount_yoy",11.11);
        rateMap.put("fagai_approved_amount_yoy",22.22);
        rateMap.put("jingxin_approved_amount_yoy",33.33);
        rateMap.put("shangwu_approved_amount_yoy",0.00);
        rateMap.put("wenhua_approved_amount_yoy",33.33);
        //明显,上述计算之和为99.99,而不是100,要使占比之和为100,可以调用下面方法]
        rateMap = CommonUtil.countRateForHundred(rateMap);
        log.info("获取后的新map是:{}",rateMap.entrySet());
    }
}

 

 
log打印结果
 
15:06:59.894 [main] INFO com.techvalley.djys.api.util.CommonUtil - 比率不为0的项目名:wenhua_approved_amount_yoy,其余项之和:66.66
15:06:59.905 [main] INFO com.techvalley.djys.api.javase.CommonUtilTest - 获取后的新map是:[wenhua_approved_amount_yoy=33.34, jingxin_approved_amount_yoy=33.33, keji_approved_amount_yoy=11.11, fagai_approved_amount_yoy=22.22, shangwu_approved_amount_yoy=0.0]

  

 
posted @ 2020-08-14 15:31  ejQiu  阅读(1051)  评论(0编辑  收藏  举报