js动态计算阶梯区间的费率?

2023-06-22 350 0

image.png
如图例,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));

image.png

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

回答

相关文章

nuxt2部署静态化和ssr的时候访问首页先报404再出现首页为什么?
`clip-path` 如何绘制圆角平行四边形呢?
多线程wait方法报错?
VUE 绑定的方法如何直接使用外部函数?
vue2固定定位该怎么做?
谁有redis实现信号量的代码,希望借鉴一下?