Алгоритм, который ежемесячно снижает годовой платеж

#javascript #function

#javascript #функция

Вопрос:

Я пытался создать систему, которая автоматически снижала бы цену каждый месяц, поэтому в декабре вы платите 1/12 от цены, а в феврале вы платите 11/12 и так далее.

Но, похоже, я не могу с этим разобраться, поэтому я здесь, чтобы попросить о помощи 🙂

 function calcTotalPrice(){
    var month = new Array();
        month[0] = "January";
        month[1] = "February";
        month[2] = "March";
        month[3] = "April";
        month[4] = "May";
        month[5] = "June";
        month[6] = "July";
        month[7] = "August";
        month[8] = "September";
        month[9] = "October";
        month[10] = "November";
        month[11] = "December";

    var d = new Date();
    var n = month[d.getMonth()];
    // document.getElementById("demo").innerHTML = n;
    var yearPrijs = 12.5;
    var membership = new Array();
    if (month[0]){
        membership[0] = yearPrice;
    }
    else{
        for(i = 0;i < month.length; i  ){
            yearPrice = yearPrice*0.9167;
            membership[i] = yearPrice;
        }
    }
} 
  

Комментарии:

1. Вы имеете в виду 12.5 - (new Date().getMonth() * 0.9167) ?

2. yearPrice*0.9167 должно быть yearPrice = yearPrice*0.9167

3. if (month[0]) всегда будет верно….

4. Общий совет: используйте отладчик и концентрируйтесь на желаемом результате каждого шага. Таким образом, вы должны быстро увидеть расхождения. Работает и без отладчика, если вы знакомы с языком программирования.

5. @Liam Что я мог сделать, чтобы сделать его лучше, я сам не силен в Javascript.

Ответ №1:

Хорошо @jssse, я думаю, я понял, что требуется.

 let startDate = new Date();
let startPrice = 12.5;

// Copy the date/price for use in the loop
let newDate = startDate;
let newPrice = startPrice;

let monthly = [];
let totalPrice = 0;

let month = new Array();
  month[0] = "January";
  month[1] = "February";
  month[2] = "March";
  month[3] = "April";
  month[4] = "May";
  month[5] = "June";
  month[6] = "July";
  month[7] = "August";
  month[8] = "September";
  month[9] = "October";
  month[10] = "November";
  month[11] = "December";


// Uncomment either:

// To start from this month, if it is January, or January next year if not
// So, for September 2020, this will be January 2021

//let startMonth = newDate.getMonth();
//if (startMonth != 0) {
//  newDate = new Date(newDate.setMonth(12));
//}

// OR:
// To start from January this year, no matter what month we are in
// so, for September 2020, this will be January 2020

newDate = new Date(newDate.setMonth(0));



for (let i = 0; i < 12; i  ) {
  newPrice = Math.round(newPrice * 100)/100;
  monthly.push({"Month": month[newDate.getMonth()], "Cost": newPrice});
  totalPrice  = newPrice;
  // create the new date/price for next month
  //newPrice = newPrice - (newPrice * (1 / 12));
  newPrice = newPrice - (startPrice / 12);
  let m = newDate.getMonth()   1;
  newDate = new Date(newDate.setMonth(m));
}
console.table(monthly);
console.log(totalPrice);  

Для подобных вещей часто проще всего создать что-то в электронной таблице — как только вы получите нужные результаты, у вас будет формула, которую вы можете преобразовать в код javascript. В этом случае это просто случай уменьшения суммы на 1/12 каждый месяц — но только после того, как будет обработан первый месяц (точно так же, как в электронной таблице — вы помещаете формулу только во вторую строку и далее).

Обычно при выводе массива я бы использовал console.table(arrayname) — но, похоже, это не работает во фрагментах, поэтому я использовал console.вместо этого войдите в систему, поэтому вам, возможно, придется скопировать код в свой собственный html-файл, чтобы увидеть значения массива.

Комментарии:

1. Эй, спасибо, чувак, за ваше время, но это не то, что я ищу. Позвольте мне объяснить лучше, каждый год, начиная с января, у вас есть цена, которая в этом году составляет 12,50 « цена = 12,50 января = цена февраля = цена / 12 * 11 марта = цена / 12 * 10 и так далее. «`

2. Разве это не был закомментированный фрагмент моего кода — строка, начинающаяся с «// ИЛИ …» ? Раскомментируйте эту строку и прокомментируйте строку выше, которая начинается с «NewPrice =», Что снижает цену на 1/12 от первоначальной цены каждый месяц. Код в его нынешнем виде даст вам 12.50, 11.46, 10.51, 9.63, 8.83, 8.09, 7.42, 6.80, 6.23, 5.71, 5.23 и 4.70. Переключая строки кодов, вы получаете: 12.50, 11.46, 10.42, 9.38, 8.34, 7.30, 6.26, 5.22, 4.18, 3.14, 2.10 и 1.06. Если ни один из них не верен, то я понятия не имею, какова ваша формула!

3. Возможно, вам будет проще сначала создать что-то в электронной таблице. Поместите начальное значение в A1, затем добавьте формулу в B1, которая вычисляет значение следующего месяца на основе значения A1. Скопируйте это, чтобы завершить год, и проверьте результаты. Если результаты соответствуют вашим потребностям, включите формулу из B1 в свой код, объясняя, что это формула, которую вы хотите превратить в код javascript. Таким образом, пока мы понимаем формулы электронных таблиц, мы можем видеть, чего вы хотите достичь.

4. Я оцениваю советы, теперь осталось сделать только одно, а именно сделать так, чтобы полная цена была указана только в январе, а не в том месяце, в котором мы находимся. Я думаю, что мне нужно изменить этот месяц [newDate.getMonth() в массив (месяцы) Или мне нужно изменить новую дату на январь?

5. Всегда ли цены будут начинаться с января? Итак, в этом месяце, в сентябре 2020 года, вы хотите начать в январе 2021 года, но если бы он запускался в январе 2021 года, тогда оставьте это? ИЛИ вы хотите вернуться к январю 2020 года на этот месяц?