技术求助:修正阶梯区间费率计算代码,实现数值分段求和
阶梯费率计算代码修正
计费规则
输入数值按以下阶梯区间计算费用,最终总和为各区间费用累加:
- 0-500,000,000(5亿):该区间金额按8%计算
- 500,000,001-2,000,000,000(20亿):超出5亿的部分按7%计算
- 2,000,000,001-10,000,000,000(100亿):超出20亿的部分按5%计算
- 10,000,000,001-30,000,000,000(300亿):超出100亿的部分按4%计算
- 30,000,000,001及以上:超出300亿的部分按3%计算
区间费率表
| 区间范围 | 费率 |
|---|---|
| 0-500M | 8% |
| >500M-2B | 7% |
| >2B-10B | 5% |
| >10B-30B | 4% |
| >30B | 3% |
示例验证
输入3,500,000,000(35亿)时,计算过程如下:
| 区间范围 | 计算金额 | 费率 | 区间费用 |
|---|---|---|---|
| 0-500M | 500,000,000 | 8% | 40,000,000 |
| >500M-2B | 1,500,000,000 | 7% | 105,000,000 |
| >2B-10B | 1,500,000,000 | 5% | 75,000,000 |
| 总计 | 3,500,000,000 | - | 220,000,000 |
原代码问题
你提供的代码逻辑完全错误,未处理阶梯区间的边界判断,直接对输入数值做无意义的减法和乘法,无法得到正确结果。
修正后的代码
function calculate(inputnumber: Int64): Extended; const Bracket1 = 500000000; // 5亿 Bracket2 = 2000000000; // 20亿 Bracket3 = 10000000000; // 100亿 Bracket4 = 30000000000; // 300亿 Rate1 = 0.08; Rate2 = 0.07; Rate3 = 0.05; Rate4 = 0.04; Rate5 = 0.03; var Part1, Part2, Part3, Part4, Part5: Extended; begin // 计算第一区间:0-500M Part1 := Min(inputnumber, Bracket1) * Rate1; // 计算第二区间:>500M-2B,取超出5亿的部分,最多15亿,不足则取实际超出值,负数则为0 Part2 := Max(0, Min(inputnumber - Bracket1, Bracket2 - Bracket1)) * Rate2; // 计算第三区间:>2B-10B,超出20亿的部分,最多80亿 Part3 := Max(0, Min(inputnumber - Bracket2, Bracket3 - Bracket2)) * Rate3; // 计算第四区间:>10B-30B,超出100亿的部分,最多200亿 Part4 := Max(0, Min(inputnumber - Bracket3, Bracket4 - Bracket3)) * Rate4; // 计算第五区间:>30B,超出300亿的部分 Part5 := Max(0, inputnumber - Bracket4) * Rate5; // 累加所有区间费用 Result := Part1 + Part2 + Part3 + Part4 + Part5; end;
代码说明
- 用常量定义各区间边界和费率,提升代码可读性与可维护性
- 每个区间单独计算:
- 用
Min确保不超过当前区间的上限 - 用
Max(0, ...)确保当输入数值未达到区间下限时,该区间费用为0
- 用
- 最后累加所有区间的计算结果,得到总费用
内容的提问来源于stack exchange,提问作者Rohollah Bolboli
相关产品推荐
相关产品推荐

