Испытание:Вечный вопрос

код уж точно не верный, как минимум возврат нескольких данных не производится через запятую, а используются для этого составные данные(массив, объект и др.)

И не думаю что здесь нужен вообще возврат

Что не так?
Ни один код не воспроизводит(

Видимо глаз замылился, немогу найти ошибку, в общем у меня неверно считается депозит с капитализацией.
Вот код, где тут может быть ошибка?

var initialAmount = 250000;
var depositDuration = 14;
var simplePercent = 7;
var complexPercent = 6.8;

var simpleDeposit = simplePercent / 1200 * depositDuration * initialAmount + initialAmount;
var complexDeposit = initialAmount;
for (var i = 1; i <= depositDuration; i++) {
  complexDeposit += complexPercent / 1200 * complexDeposit; 
}

if ( simpleDeposit > complexDeposit) {
  var recommendedType = 'simple';
  var finalAmount = Math.round(simpleDeposit);
} else {
  var recommendedType = 'complex';
  var finalAmount = Math.round(complexDeposit);
}

UPD: Ошибку сам нашел в цикле была неверная формула:

 complexDeposit += complexPercent / 1200 * initialAmount;

а должно быть:

 complexDeposit += complexPercent / 1200 * complexDeposit;

Мой топорный вариант, нужны комментарии :pensive:

Вечный вопрос
var initialAmount = 50000;
var depositDuration = 12;
var simplePercent = 7;
var complexPercent = 6;
var recommendedType = '';
var finalAmount = 0;


var calculateDeposit = function (initialAmount, percent, depositDuration, isCapitalization) {
  var totalAmount = initialAmount;
  if (isCapitalization) {
    for (var i = 0; i < depositDuration; i++) {
      totalAmount += totalAmount * (percent / 100 / 12);
    }
  }else {
    totalAmount += totalAmount * (percent / 100 / 12 * depositDuration);
  }
  return Math.round(totalAmount);
}

var simpleAmount = calculateDeposit(initialAmount, simplePercent, depositDuration, false);
var complexAmount= calculateDeposit(initialAmount, complexPercent, depositDuration, true);

if (simpleAmount > complexAmount) {
  recommendedType = 'simple';
  finalAmount = simpleAmount;
  
}else {
  recommendedType = 'complex';
  finalAmount = complexAmount;
}

Тож отпишусь

моё рабочее
var initialAmount = 50000;
var depositDuration = 12;
var simplePercent = 7;
var complexPercent = 6;
var recommendedType;
var finalAmount;

var calculateDeposit = function(deposit, percent, duration, isCapitalization) {
  if (!isCapitalization) {
    deposit *= (100+percent/12*duration)/100; 
  } else {
      for (var i = 0; i < duration; i++) {
        deposit *= (100+percent/12)/100;
      }
    }
  return Math.round(deposit);  
}
var simple = calculateDeposit(initialAmount, simplePercent, depositDuration, false);
var complex = calculateDeposit(initialAmount, complexPercent, depositDuration, true)
if (complex <= simple) {
  recommendedType = 'simple';
  finalAmount = simple;
  
} else {
  recommendedType = 'complex';
  finalAmount = complex;
  }

Обратите внимание, в функцию пишем параметры, а в сравнении уже переменные, которые принимают значение аргументов, чтобы было понятнее как делать. Также заметьте, значение “флага” капитализации не передается пользователем, оно автоматом подцепается из вызова функции в зависимости какой процент используется.

Как я понял задачу немного доработали и изменили…
Не проходит 1 проверку из 3.
По причине, как я понимаю, неверного округления в функции из предыдущего задания.
Вопрос уже задавал ранее: http://forum.academy/t/ispytanie-dengi-k-dengam/8382/61

Код
var calculateDeposit = function (dep, pr, per, isK) {
  var x = 0;
  if (!isK) {
    x = (pr / 100 / 12) * per * dep;
  }
  if (isK) {
    for (var i = 1; i <= per; i++) {
      x += (pr / 100 / 12) * (dep + x)
    }
  }
  return Math.round(x + dep);
};

var getProfitableDeposit = function (dep, per, prS, prK) {
  var zz = '';
  var xx = calculateDeposit(dep, prS, per, false);
  var yy = calculateDeposit(dep, prK, per, true);
  if (xx > yy) {
   zz = 'Выбирай обычный вклад. Заработаешь ' + xx;
  } else {
    zz = 'Выбирай капитализацию. Заработаешь ' + yy;
  }
  return zz;
};

Угу, Math.floor применяйте

1 лайк

Спасибо!

Судя по предыдущим комментариям условия в задаче немного поменялись. Кому интересны разные варианты решения -

Пожалуйста, напомните как правильно нужно вставлять код в комментарий и исправлю, использовал знак </> и не работает.

Мой код -

Сводка

/*

  1. startM - исходный размер депозита
  2. term - срок депозита в месяцах
  3. simpleInt - процентная ставка для депозита с простыми процентами
  4. capitalInt - процентная ставка для депозита с капитализацией процентов
    */

var getProfitableDeposit = function (startM, term, simpleInt, capitalInt) {
var intPmonthS = simpleInt / 12 / 100;
var intPmonthC = capitalInt / 12 / 100;
var endMS = startM + ((startM * intPmonthS) * term);
var endMC1 = startM;

for (var j = 0;j < term;j++) {
  var endMC2 = endMC1 + intPmonthC * endMC1;
  endMC1 = endMC2;
  } 
  
if (endMS > endMC1) {
  return 'Выбирай обычный вклад. Заработаешь ' + Math.floor(endMS);
  } else {return 'Выбирай капитализацию. Заработаешь ' + Math.floor(endMC1);
  } 

}

безумие какое-то. еще и работает.
вы точно не индус? :alien:

Даже не пакистанец.:wink: Я сам удивился, но работает.

странно, что вы решение предыдущей задачи сюда не прикрутили

Частично прикрепил, но в этой задаче пришлось изменить.

Предыдущая задача:

Сводка

`var calculateDeposit = function (startM, interest, term, capitalized) {
var intPmonth = interest / 12 / 100;
var intSum = 0;

if (capitalized) {
for (var i = 0; i < term; i++) {
intSum = startM * intPmonth;
startM += intSum;
}
} else {
intSum = startM * intPmonth * term;
startM += intSum;
}
return Math.floor(startM);
};`

тут вся фича в том, чтобы итоговую функцию выразить через предыдущую с разными аргументами

у вас все верно, поработайте над неймингом, я то ладно, привыкший к этой задачке, у других глазки лопнут :sob: ну и сократить чутка мон
кстати выложу современное на сегодня решение

Сводка
let calculateDeposit = function(deposit, percent, duration, isCapitalization) {
  if (!isCapitalization) {
    deposit += percent/12*duration*deposit/100; 
  } else {
      for (let i = 0; i < duration; i++) {
        deposit += percent/12/100*deposit;
      }
    }
  return Math.floor(deposit);  
}

let getProfitableDeposit = function(deposit, duration, simplePercent, complexPercent) {
  let simple = calculateDeposit(deposit, simplePercent, duration, false);
  let complex = calculateDeposit(deposit, complexPercent, duration, true);
  let recommendedType = 'капитализацию';
  let finalAmount = complex;
  
  if (complex <= simple) {
    recommendedType = 'обычный вклад';
    finalAmount = simple;
  } 
  return `Выбирай ${recommendedType}. Заработаешь ${finalAmount}`;
}
1 лайк

Я это понял, но в последней задаче не сработал код от предыдущей и пришлось выкручиваться. В предыдущей у меня формула расчёта капитализации немного другая.

Сейчас расшифровку сделаю.

var getProfitableDeposit = function(deposit, time, simplePercent, complexPercent) {
var rezForSimple,
rezForCapitaliz;

rezForSimple = deposit + Math.round((deposit * simplePercent * time) / 12/100);

rezForCapitaliz = Math.floor(deposit * (Math.pow(1+complexPercent/100/12, time)));

if(rezForSimple > rezForCapitaliz) {
  return 'Выбирай обычный вклад. Заработаешь ' + rezForSimple;  
} else {return 'Выбирай капитализацию. Заработаешь ' + rezForCapitaliz; }

}

1 лайк

var calculateDeposit = function (capital, percent, term, isCapital) {
var sum;
if(isCapital == false) {
sum = Math.floor((capital / 100 * (percent / 12 * term)) + capital);
}
else if(isCapital == true) {
var monthly;
for(var i = term; i > 0; i–) {
monthly = (capital / 100 * (percent / 12)) + capital;
capital = monthly;
sum = capital;
}
}
return Math.floor(sum);
};

var getProfitableDeposit = function(capital, term, procentSimple, procentCapital) {
var answer = ‘’;
var simple = calculateDeposit(capital, procentSimple, term, isCapital = false);
var complex = calculateDeposit(capital, procentCapital, term, isCapital = true);
if(simple > complex) {
answer = 'Выбирай обычный вклад. Заработаешь ’ + simple;
}
else if (complex > simple) {
answer = 'Выбирай капитализацию. Заработаешь ’ + complex;
}
return answer;
}

var calculateDeposit = function (sumatDep, stavkaYehr, srokVkl, kakoi) {
var sumPercent = 0;
if(kakoi){
for (var i = 0; i < srokVkl; i++) {
sumPercent = sumatDep * (stavkaYehr / 12 * 0.01);
sumatDep += sumPercent;
}
}else{
sumPercent += sumatDep * (stavkaYehr / 12 * srokVkl * 0.01);
sumatDep += sumPercent;
}
return Math.floor(sumatDep);
};

var getProfitableDeposit = function(sumatDep, srokVkl, stavkaYehr, procentCapital) {
var answer = ‘’;
var simple = calculateDeposit(sumatDep, stavkaYehr, srokVkl, kakoi = false);
var complex = calculateDeposit(sumatDep, procentCapital, srokVkl, kakoi = true);
if(simple > complex) {
answer = 'Выбирай обычный вклад. Заработаешь ’ + simple;
} else {
answer = 'Выбирай капитализацию. Заработаешь ’ + complex;
}
return answer;
}

true и false местами поменяйте

Как то так. Правда переделал предыдущий из задания, а то он не очень подходил

 var getProfitableDeposit = function (startDeposit, timeForDeposit, persentForNormal, persentForCapitalizetion) {
      //Normal
      var normal = Math.floor(startDeposit + (persentForNormal / 100 / 12) * timeForDeposit * startDeposit)
      //Capitalizetion
      for (var i = 1, j = startDeposit; i <= timeForDeposit; i++) {
        j += j * (persentForCapitalizetion / 100 / 12)
      } var capitalizetion = Math.floor(j);
      //Who more
      if (normal > capitalizetion) { return 'Выбирай обычный вклад. Заработаешь ' + normal }
      if (normal < capitalizetion) { return 'Выбирай капитализацию. Заработаешь ' + capitalizetion }
    }