如图例,0~499999内计算为*0.3;
500000~999999内计算为0~499999部分0.3,剩余部分0.25.
范围,和费率不固定,区间数也都动态配置,请教有没有什么方便的写法?
function calculateFee (amount) {
// 配置不同的阶梯费率
const rates = [
{ upperLimit: 499999, rate: 0.3 },
{ upperLimit: 999999, rate: 0.25 },
// 可以添加更多的阶梯费率配置
// { upperLimit: ..., rate: ... },
// { upperLimit: ..., rate: ... },
];
let fee = 0; // 初始费用
for (let i = 0; i < rates.length; i++) {
const currentRate = rates[i];
if (amount <= currentRate.upperLimit) {
fee += amount * currentRate.rate; // 计算当前阶梯的费用
break; // 跳出循环,不再计算后续阶梯的费用
} else {
fee += currentRate.upperLimit * currentRate.rate; // 计算当前阶梯的费用
amount -= currentRate.upperLimit; // 减去已计算的部分金额
}
}
return fee;
}
// 测试计算费用
console.log(calculateFee(200000));
console.log(calculateFee(700000));
function count(value) {
let ret = 0;
[
{ lower: 0, upper: 499_999, rate: 0.3 },
{ lower: 500_000, upper: 999_999, rate: 0.25 },
{ lower: 1_000_000, upper: 1_999_999, rate: 0.2 },
].some(({ lower, upper, rate }) => {
if (value >= lower) {
ret += (value > upper ? upper : value - lower) * rate;
} else {
return true;
}
});
return ret;
}
console.log(count(200_000));
console.log(count(800_000));
console.log(count(1_600_000));
const levels = [
{ up: 500_000, rate: 0.30 },
{ up: 1_000_000, rate: 0.25 },
{ up: 2_000_000, rate: 0.20 },
];
function calcFee(value) {
let amount = 0;
let past = 0;
for (const {up, rate} of levels) {
if (value > up) {
amount += (up - past) * rate;
past = up;
} else {
amount += (value - past) * rate;
past = value;
break;
}
}
if (value - past > 0) {
amount += (value - past) * levels[levels.length - 1].rate;
}
return amount;
}
const cases = [
500,
499999,
500001,
800000,
1000100,
2000010
];
cases.forEach(v => console.log(calcFee(v)));
150
149999.69999999998
150000.25
225000
275020
475002