Вы можете рассчитать ставку за каждый день в for
l oop и затем суммировать их. Для этого небольшая вспомогательная функция 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());
Итак, это будет работать. Если вы хотите sh, чтобы свести ее в одну математическую формулу, вам понадобится:
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));
Однако математическая формула будет только работать для этого определенного c деления дней и ставок. Это не очень ремонтопригодно, если оно меняется и должно часто меняться. Нетрудно получить новые формулы, но, вероятно, это не лучшее использование вашего времени. Вам лучше использовать итеративный подход, поскольку в будущем его будет легче расширять.