比如,0.15+0.7+0.16=1.01,超出1,将最大的那个数字减去0.01,变成1。
这里将0.7-0.01=0.69,0.15+0.69+0.16=1
[
{"rate":"0.15","sceneName":"乘地铁"},
{"rate":"0.7","sceneName":"乘公交"},
{"rate":"0.16","sceneName":"步行"}
]
public class CarbonCensus {
//场景名
private String sceneName;
//占比
private String rate;
}
public class Test {
public static void main(String[] args) {
List<CarbonCensus> carbonCensusList = new ArrayList<>();
CarbonCensus carbonCensus = new CarbonCensus();
carbonCensus.setSceneName("乘地铁");
carbonCensus.setRate("0.15");
carbonCensusList.add(carbonCensus);
carbonCensus = new CarbonCensus();
carbonCensus.setRate("0.7");
carbonCensus.setSceneName("乘公交");
carbonCensusList.add(carbonCensus);
carbonCensus = new CarbonCensus();
carbonCensus.setRate("0.16");
carbonCensus.setSceneName("步行");
carbonCensusList.add(carbonCensus);
if (CollectionUtil.isEmpty(carbonCensusList)) {
return;
}
//合计
BigDecimal bigDecimal = new BigDecimal(0);
for(int i=0; i<carbonCensusList.size(); i++) {
bigDecimal = bigDecimal.add(new BigDecimal(carbonCensusList.get(i).getRate()));
}
double rate = bigDecimal.doubleValue();
if(rate == 1) {
return;
}
if(rate > 1) {
//需要减的次数,比如rate=1.02,就是减2次
int minusCount = (int)(rate * 100 - 100);
for (int i=0; i<minusCount; i++) {
Optional<CarbonCensus> optional = carbonCensusList.stream().max(((o1, o2) ->
(int)(Double.parseDouble(o1.getRate())*100) - (int)(Double.parseDouble(o2.getRate())*100)));
if(optional.isPresent()) {
CarbonInfoResp.CarbonCensus item = optional.get();
item.setRate(new BigDecimal(item.getRate()).subtract(new BigDecimal("0.01")).toString());
}
}
} else if(rate < 1) {
//需要加的次数,比如rate=0.98,就是加2次
int addCount = (int)(100 - rate * 100);
for (int i = 0; i< addCount; i++) {
Optional<CarbonCensus> optional = carbonCensusList.stream().min(((o1, o2) ->
(int)(Double.parseDouble(o2.getRate())*100) - (int)(Double.parseDouble(o1.getRate())*100)));
if(optional.isPresent()) {
CarbonInfoResp.CarbonCensus item = optional.get();
item.setRate(new BigDecimal(item.getRate()).add(new BigDecimal("0.01")).toString());
}
}
}
System.out.println(JSON.toJSONString(carbonCensusList));
//[{"rate":"0.15","sceneName":"乘地铁"},{"rate":"0.69","sceneName":"乘公交"},{"rate":"0.16","sceneName":"步行"}]
}
}