Испытание: Деньги к деньгам

hhh это сумма с процентами после первой итерации,
финальная сумма это первая итерация (например, после перовго месяца начисления процентов) плюс (0.01*persentForYear/12)*hhh это уже проценты от первого месяца капитализации (уже учитывая, что % начисляются на увеличенную с % сумму)

Вы объявляете переменную внутри цикла, тем самым она создается заново на каждой итерации цикла. А так не должно быть.

то есть сделать var hhh;
перед циклом?

Попробуйте.

опять то же самое(

Рассчитываемые значения hhh и finalMoney не изменяются с каждой итерацией цикла. Функция просто несколько раз просчитывает одно и то же, с неизменными исходными данными.
Попробуйте дописать внутри цикла вывод переменных в консоль, чтобы понять, что я имею в виду.

Не понимаю.
Сравниваю с кодом других (которые по методу решения более-менее схожи с моим), ну одинаковые формулы, а результат разный! :tired_face:
Переделала, теперь две проверки не проходит, 2 из трех с капитализацией не проходят.

var calculateDeposit = function (startAmount, persentForYear, periodOfDepositInMonth, 
capitalization) {

if (capitalization) {
 var total = startAmount;
for(var i = 1; i <= periodOfDepositInMonth; i++) {
total += (persentForYear / 12) * total;
}
return(Math.round(total));}
else
{var finalMoney = startAmount +startAmount*(0.01 * 
persentForYear/12)*periodOfDepositInMonth;

return(Math.round(finalMoney));
} 
}

Начальная сумма: 100000 рублей, годовой процент: 12%, вклад на 1 мес., с капитализацией, ожидаемый результат: 101000 рублей.

Результат работы функции calculateDeposit равный 200000 не совпадает с ожидаемым значением 101000.
Начальная сумма: 100000 рублей, годовой процент: 10%, вклад на 2 мес., с капитализацией, ожидаемый результат: 101674 рублей.

Результат работы функции calculateDeposit равный 336111 не совпадает с ожидаемым значением 101674.

На 0,01 здесь не умножаете уже, почему?

ДА!!! СПАСИБО!! :+1::fairy:такая мелочь оказалась
))

var depoz = 0;
var procent = 0;
var calculateDeposit = function (nach, proc, mounth, kap) {
if(kap){
for(i = 0; i < mounth; i++){
procent = Math.round((nach + procent) + (proc / 100 / 12) * (nach + procent) - nach);
}
depoz += nach + procent;
}else{
depoz = Math.round(nach + (proc / 100 / 12) * mounth * nach);
}
return depoz;
};

calculateDeposit(200000, 0, 6, true);

Всем привет!) Такой вопрос. Почему когда я руками подставляю данные, пишет что всё ок, получаю данные которые требуются. но когда нажимаю проверить, там уже другие данные получают.

Поясните свою формулу расчета процентов.

(nach + procent) - начальный депозит + прирост за месяц.
(proc / 100 / 12) - процент в месяц
(nach + procent) - начальный депозит + прирост за месяц

  • nach - вычитаем начальный депозит, что бы получить чистый прирост.
    например Начальный депозит 1000; процентная ставка 8%; 3 месяца.
    Как только начинается вклад, прирост за месяц 0 соотвественно
    (1000 + 0) + (8 / 100 / 12) * (1000 + 0) - 1000);
    Прирост за 1й месяц = 7;
    теперь procent = 7;
    (1000 + 7) + (8 / 100 / 12) * (1000 + 7) - 1000)
    теперь procent = 14;
    (1000 + 14) + (8 / 100 / 12) * (1000 + 14) - 1000)
    теперь procent = 21;
    Нашёл правку
    depoz += nach + procent;
    меняю на depoz = nach + procent;
    Теперь депозит равен начальному депозиту + прирост.
    не получается со случаем если
    Начальная сумма: 100000 рублей, годовой процент: 10%, вклад на 2 мес., с капитализацией, ожидаемый результат: 101674 рублей

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

Сделал, стало лучше, спасибо. Но всё равно не работает. Пример
calculateDeposit(100000, 12, 1, true); Запрашиваю функцию с такими аргументами.
В ответ приходит 101000 как и требуется. Но при запуске программы. Пишет,
Результат работы функции calculateDeposit равный 102010 не совпадает с ожидаемым значением 101000.
откуда берётся 102010 не пойму

Не вызывайте функцию самостоятельно. Без вызова всё считает правильно.
@juwain, просьба прокомментировать эту странность.

1 лайк

Действительно. А я уже 2-й час сижу и не могу понять в чем дело) Спасибо)

Получилось как-то так .

Summary
var calculateDeposit = function (start, percent, term, isCapitalized) {
if (isCapitalized) {
  allMoney = Math.round(start*(Math.pow((1 + (percent / 100) / 12), term)));
  return(allMoney);
  }
  allMoney =start +  Math.round(start *(((percent / 100) / 12) * term));
  return(allMoney);

};

Спросил разработчиков, напишут.

Привет от автора курса)
Смотрите, тут есть две причины.
1 - педагогическая. У нас образовательные курсы и с точки зрения обучения проще объяснить, что функцию можно положить в переменную, чтобы в будущем ученику было проще понять коллбэки и тд
2 - функции, объявленные, как Function Declaration ведут себя непредсказуемо, их можно вызвать из любой части кода, они подвешиваются и тд

В общем, мы не против Function Declaration. Если вы понимаете все особенности и подводные камни такого объявления, умеете, учитывая это, работать с такими функциями, используйте их)

3 лайка

Почему формула накопления процента будет работать, честно говоря, не разобрался.

Но чтобы отдельный вызов функции не влиял на её работоспособность, предлагаю внести переменные depoz и procent внутрь функции. Тогда вызов не будет их модифицировать.