阶梯水价计算
阶梯水价,阶梯电价等的特点都是用的越多,对应的价格费用越贵。这种阶梯式的算法直观的计算是比较简单的,小学数学的水平应该就可以轻松完成,但是换成程序语言来设计成算法的话,还是比较困难的。
一、算法要求
本文的水价算法是由水价,资费,污水处理费三部分组成,当前阶梯计算公式为:
应缴水费 = (水价+资费+污水处理费) 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;
}
三、表结构参考
四、结果测试
这里测试的是用前段传过来的值,而不是数据库中的数据