超过某个输入值时 JavaScript 中的百分比

Percentage in JavaScript when over a certain input value

我的客户需要一个以特定方式工作的公式。

这是我的代码:

/* 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

30% of 50 x 4 = 140

总计 = 860

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

这可能是一种解决方案:

var value = 22
var rate = 50
var total = 0
var baseDiscount = 20
var more18DaysDiscount = 30

if (this.value <= 18) {
    total = value * rate * (100-baseDiscount)/100
} else {
    var baseTotal = 18 * rate * (100-baseDiscount)/100
    var more18DaysTotal = (value - 18) * rate * (100-more18DaysDiscount)/100
    total = baseTotal + more18DaysTotal
}

console.log(total)

您可以在 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));

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