hhh это сумма с процентами после первой итерации,
финальная сумма это первая итерация (например, после перовго месяца начисления процентов) плюс (0.01*persentForYear/12)*hhh это уже проценты от первого месяца капитализации (уже учитывая, что % начисляются на увеличенную с % сумму)
Вы объявляете переменную внутри цикла, тем самым она создается заново на каждой итерации цикла. А так не должно быть.
то есть сделать var hhh;
перед циклом?
Попробуйте.
Рассчитываемые значения hhh и finalMoney не изменяются с каждой итерацией цикла. Функция просто несколько раз просчитывает одно и то же, с неизменными исходными данными.
Попробуйте дописать внутри цикла вывод переменных в консоль, чтобы понять, что я имею в виду.
Не понимаю.
Сравниваю с кодом других (которые по методу решения более-менее схожи с моим), ну одинаковые формулы, а результат разный!
Переделала, теперь две проверки не проходит, 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 здесь не умножаете уже, почему?
ДА!!! СПАСИБО!! такая мелочь оказалась
))
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, просьба прокомментировать эту странность.
Действительно. А я уже 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. Если вы понимаете все особенности и подводные камни такого объявления, умеете, учитывая это, работать с такими функциями, используйте их)
Почему формула накопления процента будет работать, честно говоря, не разобрался.
Но чтобы отдельный вызов функции не влиял на её работоспособность, предлагаю внести переменные depoz
и procent
внутрь функции. Тогда вызов не будет их модифицировать.