首页 > 解决方案 > 超过某个输入值时 JavaScript 中的百分比

问题描述

我的客户需要一个公式以某种方式工作。

这是我的代码:

/* Daily rate */
var rate = 50;

/* If 18 days or less, discount is 20% */
if (this.value <= 18) {
    var discount = 20;
} 
/* Otherwise if more than 18 days */
else if (this.value > 18) {
    var discount = 30;
}

/* Total - I realise this is wrong and needs to be changed */
total = rate / 100 * discount; 

console.log(total);

基本上它需要的工作方式是,如果this.value超过 18 天,那么折扣只需 18 天后每天的 30%。

例如,如果this.value是 22,那么 20% 的折扣仍然适用于最多 18 天的每一天,但 30% 的折扣也需要18 天后的每一天适用,在这种情况下为 4 天。

预期结果为 860。

因为...

50 x 18 的 20% = 720

50 x 4 的 30% = 140

总计 = 860

如何修改我的代码以适应?

标签: javascriptlogicformula

解决方案


您可以循环计算每天的费率,for然后将它们加起来。为此,一个小辅助函数discountForDay可以处理每天的可变折扣率,这可以使以后更容易重构:

//fake the value by putting it in an object
var obj = {
  value: 5,
  discountForDay: function(day) {
    if (day <= 18) {
        return 0.20;
    } 
    /* Otherwise if more than 18 days */
    else if (day > 18) {
        return 0.30;
    }
  },
  calculate: function() {
    /* Daily rate */
    var rate = 50;

    var total = 0;
    
    for(var i = 0; i < this.value; i++) {
      var discount = this.discountForDay(i + 1);
      var rateForDay = rate - discount * rate;
      
      total += rateForDay;
    }

    return total
  }
}

console.log("total for 5 days:", obj.calculate());

obj.value = 18;
console.log("total for 18 days:", obj.calculate());

obj.value = 22;
console.log("total for 22 days:", obj.calculate());

所以,这会奏效。如果您希望将其折叠成一个数学公式,那么您需要:

Total = (rate * min(days, 18) -  rate * min(days, 18) * 0.2) + (rate * max((days-18), 0) -  rate * max((days-18), 0) * 0.3)
      = rate * min(days, 18) * (1 - 0.2) + rate * max((days-18), 0) * (1 - 0.3)
      = rate * (min(days, 18) * 0.8 + max((days-18), 0) * 0.7)

因此,当编码为函数时,这是:

function calculate(rate, days) {
  return rate * (Math.min(days, 18) * 0.8 + Math.max((days-18), 0) * 0.7)
}

console.log("total for 5 days:", calculate(50, 5));
console.log("total for 18 days:", calculate(50, 18));
console.log("total for 22 days:", calculate(50, 22));

但是,数学公式适用于这种特定的天数和费率划分。如果它改变并且必须经常改变,它就不是很容易维护。推导出新公式并不难,但这可能不是您时间的最佳利用方式。您最好采用迭代方法,因为它在未来更容易扩展。


推荐阅读