利潤 I 分段提成:
I ≤ 100,000:10%100,000 < I ≤ 200,000:超出部分 7.5%200,000 < I ≤ 400,000:超出部分 5%400,000 < I ≤ 600,000:超出部分 3%600,000 < I ≤ 1,000,000:超出部分 1.5%I > 1,000,000:超出部分 1%
double bonus = 0;
if (I <= 100000) {
bonus = I * 0.10;
} else if (I <= 200000) {
bonus = 100000*0.10 + (I-100000)*0.075;
} else if (I <= 400000) {
bonus = 100000*0.10 + 100000*0.075 + (I-200000)*0.05;
} else if (I <= 600000) {
bonus = 100000*0.10 + 100000*0.075 + 200000*0.05 + (I-400000)*0.03;
} else if (I <= 1000000) {
bonus = 100000*0.10 + 100000*0.075 + 200000*0.05 + 200000*0.03 + (I-600000)*0.015;
} else {
bonus = 100000*0.10 + 100000*0.075 + 200000*0.05 + 200000*0.03 + 400000*0.015 + (I-1000000)*0.01;
}
int idx = (I - 1) / 100000; // 將利潤映射到 0,1,2,3,4,5,6,7,8,9,10...
double bonus = 0;
switch (idx) {
case 0: bonus = I * 0.10; break;
case 1: bonus = 100000*0.10 + (I-100000)*0.075; break;
case 2: case 3: bonus = 100000*0.10 + 100000*0.075 + (I-200000)*0.05; break;
case 4: case 5: bonus = 100000*0.10 + 100000*0.075 + 200000*0.05 + (I-400000)*0.03; break;
case 6: case 7: case 8: case 9:
bonus = 100000*0.10 + 100000*0.075 + 200000*0.05 + 200000*0.03 + (I-600000)*0.015; break;
default: // idx >= 10
bonus = 100000*0.10 + 100000*0.075 + 200000*0.05 + 200000*0.03 + 400000*0.015 + (I-1000000)*0.01; break;
}
| 維度 | if-else | switch |
|---|---|---|
| 可讀性 | 高,邏輯直觀 | 需理解映射技巧,case 合並易漏 |
| 性能 | 順序判斷,最壞 O(n) | 編譯器常優化為跳轉表 O(1) |
| 維護性 | 修改區間只需改條件 | 修改區間需重新推導 idx 映射 |
| 適用場景 | 區間邊界不規則、邏輯複雜 | 區間等寬、案例固定、極度追求速度 |
建議:業務邏輯優先用 if-else,確保正確性與可維護性;switch 適合編譯器可優化的熱路徑或狀態機。