首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現企業利潤分級提成計算:階梯式獎金邏輯完整解析

     編輯:Java 相關知識

企業常見的階梯式提成計算:利潤不同區間對應不同提成率。本文實現完整的分級計算邏輯,修正原始程式碼中的區間邊界錯誤,並提供可擴展的資料驅動設計。

提成規則表

利潤區間(萬元)提成率備註
0 ~ 1010%全額按 10%
10 ~ 207.5%超過 10 萬部分
20 ~ 405%超過 20 萬部分
40 ~ 603%超過 40 萬部分
60 ~ 1001.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;
    }
}

邏輯驗證範例

利潤(萬)手動計算程式輸出
55 × 10% = 0.50.50
1510×10% + 5×7.5% = 1.3751.38
3010×10% + 10×7.5% + 10×5% = 2.252.25
12010×10% + 10×7.5% + 20×5% + 20×3% + 40×1.5% + 20×1% = 5.155.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
    }
}

總結

  1. 階梯式計算核心:只對區間內的增量乘以對應稅率,並累加前區間結果。
  2. 使用陣列或 record 封裝區間配置,避免硬編碼 if-else 鏈,便於維護與擴展。
  3. 單位統一:輸入、閾值、輸出建議同單位(如萬元),減少換算錯誤。
  4. 邊界測試:務必驗證閾值點(10、20、40...)與跨區間數值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved