当统计时,四舍五入超过100%,怎么处理

该博客介绍了如何在Java中实现一个算法,当一组数据的占比总和超过1时,通过调整最大值使其总和保持为1。示例代码展示了如何遍历列表,找到最大值并减去超出部分,从而达到平衡比例的目的。

比如,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":"步行"}]


    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值