解决:多种类型占比之和不为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]
浙公网安备 33010602011771号