超过某个输入值时 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));
但是,数学公式仅适用于这种特定的天数和费率划分。如果它更改并且必须经常更改,则它不是很容易维护。推导出新公式并不难,但这可能不是您时间的最佳利用方式。您最好采用迭代方法,因为它在未来更容易扩展。
我的客户需要一个以特定方式工作的公式。
这是我的代码:
/* 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));
但是,数学公式仅适用于这种特定的天数和费率划分。如果它更改并且必须经常更改,则它不是很容易维护。推导出新公式并不难,但这可能不是您时间的最佳利用方式。您最好采用迭代方法,因为它在未来更容易扩展。