解决:多种类型占比之和不为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&¬NeedCount){ //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]