企業常見的階梯式提成計算:利潤不同區間對應不同提成率。本文實現完整的分級計算邏輯,修正原始程式碼中的區間邊界錯誤,並提供可擴展的資料驅動設計。
| 利潤區間(萬元) | 提成率 | 備註 |
|---|---|---|
| 0 ~ 10 | 10% | 全額按 10% |
| 10 ~ 20 | 7.5% | 超過 10 萬部分 |
| 20 ~ 40 | 5% | 超過 20 萬部分 |
| 40 ~ 60 | 3% | 超過 40 萬部分 |
| 60 ~ 100 | 1.5% | 超過 60 萬部分 |
| 100 以上 | 1% | 超過 100 萬部分 |
import java.util.Scanner;
public class BonusCalculator {
// 區間上限(萬元)與對應稅率
private static final double[] THRESHOLDS = {10, 20, 40, 60, 100, Double.MAX_VALUE};
private static final double[] RATES = {0.10, 0.075, 0.05, 0.03, 0.015, 0.01};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("請輸入當月利潤(萬元):");
double profit = sc.nextDouble(); // 單位:萬元
sc.close();
double bonus = calculateBonus(profit);
System.out.printf("應發獎金總額:%.2f 萬元%n", bonus);
}
public static double calculateBonus(double profit) {
double bonus = 0;
double prev = 0;
for (int i = 0; i < THRESHOLDS.length; i++) {
if (profit <= THRESHOLDS[i]) {
bonus += (profit - prev) * RATES[i];
break;
} else {
bonus += (THRESHOLDS[i] - prev) * RATES[i];
prev = THRESHOLDS[i];
}
}
return bonus;
}
}
| 利潤(萬) | 手動計算 | 程式輸出 |
|---|---|---|
| 5 | 5 × 10% = 0.5 | 0.50 |
| 15 | 10×10% + 5×7.5% = 1.375 | 1.38 |
| 30 | 10×10% + 10×7.5% + 10×5% = 2.25 | 2.25 |
| 120 | 10×10% + 10×7.5% + 20×5% + 20×3% + 40×1.5% + 20×1% = 5.15 | 5.15 |
// 原始碼片段
} else if (lirun <= 400000) {
sum = 17500 + lirun * 0.05; // 錯誤!應為 17500 + (lirun-200000)*0.05
} else if (lirun <= 600000) {
sum = lirun * 0.03; // 錯誤!漏掉前段累積
}
原始碼直接用總利潤乘以當前稅率,忽略了「只對超過部分計提」的規則,導致 20~40 萬、40~60 萬區間計算錯誤。
public class TieredBonusCalculator {
private record Tier(double upperBound, double rate) {}
private final Tier[] tiers;
public TieredBonusCalculator(Tier... tiers) {
this.tiers = tiers;
}
public double calculate(double profit) {
double bonus = 0, prev = 0;
for (Tier t : tiers) {
double taxable = Math.min(profit, t.upperBound()) - prev;
if (taxable <= 0) break;
bonus += taxable * t.rate();
prev = t.upperBound();
}
return bonus;
}
// 使用範例
public static void main(String[] args) {
var calc = new TieredBonusCalculator(
new Tier(10, 0.10),
new Tier(20, 0.075),
new Tier(40, 0.05),
new Tier(60, 0.03),
new Tier(100, 0.015),
new Tier(Double.MAX_VALUE, 0.01)
);
System.out.println(calc.calculate(120)); // 5.15
}
}
record 封裝區間配置,避免硬編碼 if-else 鏈,便於維護與擴展。