阶梯水价计算

阶梯水价计算

 阶梯水价,阶梯电价等的特点都是用的越多,对应的价格费用越贵。这种阶梯式的算法直观的计算是比较简单的,小学数学的水平应该就可以轻松完成,但是换成程序语言来设计成算法的话,还是比较困难的。

一、算法要求

 本文的水价算法是由水价,资费,污水处理费三部分组成,当前阶梯计算公式为:
应缴水费 = (水价+资费+污水处理费) X 用水量
[其中:污水处理费比例默认为100%]

  • 1.可动态的设定各阶梯的水费,资费,污水处理费

  • 2.可以动态的改变阶梯数,至少设定1阶,阶数无上限

在这里插入图片描述

二、算法代码

 /**
    * @Description:  计算阶梯水费
    * @Param: 【waterFeeCategoryList】 阶梯对象
     * WaterFeeCategoryDto:
     * level 当前阶梯等级
     * waterFee 水费
     * ziFee 资费
     * sewageTreatmentFee 污水处理费(默认比例为100%)
     *【集合中对象必须按照level等级排序,如level1,level2,level3】
     * , 【consumption】 用水量
    * @Date: 2020/1/17 0017
    */
    public double getStepWaterFee(List<WaterFeeCategoryDto> waterFeeCategoryList, Double consumption){
        //1.确定当前用水量的阶数
        int jieshu = 1;
        for(int i=0; i<waterFeeCategoryList.size();i++){
            if(consumption > waterFeeCategoryList.get(i).getEndNumber()){
                jieshu++ ;
            }
        }
        //2.阶数确定后,分成两部计算:(1)计算此前阶数-1的固定消费[阶数必定大于1]   (2)计算当前阶的阶数消费
          //这里微调,用水量超过最大阶数后,阶数会溢出1个,调整为最大的阶数
        if(jieshu > waterFeeCategoryList.size()){
            jieshu = waterFeeCategoryList.size();
        }

        double fee = 0;
        if(jieshu == 1){  //如果阶数为1
            WaterFeeCategoryDto dto = waterFeeCategoryList.get(0);
            double waterFee = dto.getWaterFee();
            double sewageTreatmentFee= dto.getSewageTreatmentFee();
            double ziFee = dto.getZiFee();
            fee = fee + (waterFee+sewageTreatmentFee+ziFee)*consumption;

        }else{
            for(int i=1; i<jieshu; i++){
                if(i!=jieshu-1){ //当前水费不在对应的阶数,计算之前的水费
                    WaterFeeCategoryDto dto = waterFeeCategoryList.get(i);
                    double waterFee = dto.getWaterFee();
                    double sewageTreatmentFee= dto.getSewageTreatmentFee();
                    double ziFee = dto.getZiFee();
                    double endNumber1 = waterFeeCategoryList.get(i-1).getEndNumber();
                    double endNumber2 = dto.getEndNumber();
                    fee = fee + (waterFee+sewageTreatmentFee+ziFee)*(endNumber2-endNumber1);
                }else{  //当前水费在对应的阶数
                    WaterFeeCategoryDto dto = waterFeeCategoryList.get(i);
                    double waterFee = dto.getWaterFee();
                    double sewageTreatmentFee= dto.getSewageTreatmentFee();
                    double ziFee = dto.getZiFee();
                    double endNumber = waterFeeCategoryList.get(i-1).getEndNumber();
                    fee = fee + (waterFee+sewageTreatmentFee+ziFee)*(consumption-endNumber);
                }

            }
            //最后加上第一阶梯的费用
            WaterFeeCategoryDto dto = waterFeeCategoryList.get(0);
            double waterFee = dto.getWaterFee();
            double sewageTreatmentFee= dto.getSewageTreatmentFee();
            double ziFee = dto.getZiFee();
            double endNumber = dto.getEndNumber();
            fee = fee +(waterFee+sewageTreatmentFee+ziFee)*(endNumber);
        }
        System.out.println("当前的耗水量为:"+consumption);
        System.out.println("当前的阶数为:"+jieshu);
        System.out.println("当前水费为:"+fee);
        System.out.println("------------------------");



        return fee;
    }

三、表结构参考

四、结果测试

这里测试的是用前段传过来的值,而不是数据库中的数据

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值