javascript - 超过某个输入值时 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
如何修改我的代码以适应?
解决方案
您可以循环计算每天的费率,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));
但是,数学公式仅适用于这种特定的天数和费率划分。如果它改变并且必须经常改变,它就不是很容易维护。推导出新公式并不难,但这可能不是您时间的最佳利用方式。您最好采用迭代方法,因为它在未来更容易扩展。
推荐阅读
- javascript - 我可以使用 fetch 进行“Mailjet”API 调用吗?
- delphi - 使用 Indy 和 ContentType = 'multipart/mixed' 发送电子邮件的问题
- firebase - 我的 firebase 应用程序在我尝试打开它的那一刻停止工作
- python - Python DataFrame 布局更改
- node.js - 用于对目录中的文件进行文本搜索的 NodeJS 库
- elasticsearch - 在 Prometheus 警报规则的标签值中使用今天的日期
- php - 如何跳到 PHP 语句中的下一个“elseif”?
- javascript - 进行 Ajax 调用后,如何重定向到 .Net Core 中的操作?
- javascript - 在 chrome 上删除元素时,Aria-live 区域不会读取更新
- sql - 获取特定时区的特定日期