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

image.png
如图例,0~499999内计算为*0.3;
500000~999999内计算为0~499999部分0.3,剩余部分0.25.
范围,和费率不固定,区间数也都动态配置,请教有没有什么方便的写法?

阅读 2.7k
3 个回答
 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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题