Процент в JavaScript при превышении определенного входного значения - PullRequest
0 голосов
/ 31 марта 2020

Моему клиенту нужна формула для работы определенным образом.

Вот мой код:

/* 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 дней, тогда скидка должна составлять только 30% каждого дня после 18 *. 1007 *

Так, например, если this.value равен 22, тогда скидка 20% по-прежнему применяется для каждого дня до 18 дней, но скидка 30% также должна применяться на каждый день после 18 дней, в данном случае - 4 дня.

Ожидаемый результат будет 860.

Потому что .. .

20% от 50 x 18 = 720

30% от 50 x 4 = 140

Всего = 860

Как я могу изменить свой код разместить?

Ответы [ 2 ]

2 голосов
/ 31 марта 2020

Вы можете рассчитать ставку за каждый день в 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 деления дней и ставок. Это не очень ремонтопригодно, если оно меняется и должно часто меняться. Нетрудно получить новые формулы, но, вероятно, это не лучшее использование вашего времени. Вам лучше использовать итеративный подход, поскольку в будущем его будет легче расширять.

1 голос
/ 31 марта 2020

Это может быть одно решение:

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)
...