Подскажите, где я ошибся в коде?
var calculateDeposit = function (startDeposite, percent, months, capitalizase) {
if (!capitalizase) {
var generalPercent = (percent / 100 / 12) * months * startDeposite;
return Math.floor(startDeposite + generalPercent);
}
var summAfterFirstMonth = startDeposite;
if (capitalizase) {
for (var i = 0; i < months; i++) {
summAfterFirstMonth = summAfterFirstMonth + (percent / 100 / 12) * startDeposite;
return Math.floor(summAfterFirstMonth);
}}
};
Проходит все проверки, кроме предпоследней :
Результат работы функции calculateDeposit
равный 100833
не совпадает с ожидаемым значением 101673
.
Ого, не видел темы, спасибо! А не подскажите почему тогда, раз код неверный, но почти все проверки он успешно проходит?
без капитализации формула правильная (точнее 2 части формулы, вы её на 2 разбили выходит, одна половина в условии, вторая в возврате значения). лаконичнее просто не заводить новую переменную для вывода результата, потому я предлагаю переписать имеющуюся.
generalPercent = (percent / 100 / 12) * months * startDeposite;
и Math.floor(startDeposite + generalPercent);
сокращаем: (percent / 100 / 12) * months * startDeposite + startDeposite
startDeposite за скобки:
startDeposite * ((percent / 100 / 12) * months + 1)
100 за скобки:
startDeposite * (percent / 12 * months + 100) / 100
- вот она рыба моей мечты моя формула
во второй формуле вы каждый раз возвращаетесь к startDeposite, а должны к новой переменной. в итоге запутались, потому я и предлагаю всегда перезаписывать
проверки:
без капитализации - верно
с капитализацией, но 1 итерация - тоже верно
без капитализации - верно.
с капитализацией - 2 итерации - неверно
без капитализации - верно.
процент = 0, так что в любом случае какую бы примерно “правильную” формулу не награмоздили, выйдет стартовый депозит. проверка тупо на равенство входящему значению. можно было бы написать тупо result = startDeposit;
- тоже бы прошло =)
1 лайк
var calculateDeposit = function (firstSum, percents, monthAmount, capitalized) {
if (!capitalized){
var perMonth = percents / 12 * monthAmount;
return Math.floor(firstSum += firstSum / 100 * perMonth);
} else {
var perMonth = percents / 12;
for (var i = 0; i < monthAmount; i++){
firstSum += firstSum / 100 * perMonth;
}
return Math.floor(firstSum);
}
};
Все работает))
1 лайк
а что цикл делает?без него не работает
ну цикл пересчитывает базовую ставку ежемесячно, например.
Почему не проходит проверку с капитализацией для 2 мес? Считает только для одного.
var calculateDeposit = function (initial, yearPercent, months, kapital) {
var finalMoney = initial;
var monthPercent = yearPercent/12; /percent for 1 month /
if (kapital){
for (var i=0; i<months; i++){
return finalMoney = Math.floor(finalMoney + finalMoney*(monthPercent/100));
}
} else {
return finalMoney=Math.floor(finalMoney + (finalMoney*monthPercent/100
)*months);
}
};
Вот рабочий код:
var calculateDeposit = function (startSum, procent, month, cap) {
var balance = startSum;
if (cap) {
for ( var i = 1; i <= month; i++ ) {
balance += balance * (procent / 12) / 100;
};
} else {
balance += balance * (procent / 12 * month) / 100;
};
return Math.floor(balance);
};
Alexei
13.Май.2021 07:38:23
13
Я сделал двумя похожими способами. Первый через дополнительную функцию с циклом. Правда как-то громоздко получилось.)
Решение №1
let calculateDeposit = function (initialSum, percentAge, depositMonths, boolVariable) {
let percent = percentAge / 100;
let depositTotal = 0;
if(!boolVariable) {
depositTotal = (percent / 12) * depositMonths * initialSum;
depositTotal += initialSum;
}
else {
depositTotal = calculateDepositMonths(initialSum, percentAge, depositMonths, boolVariable);
}
return Math.floor(depositTotal);
};
let calculateDepositMonths = function (initialSum, percentAge, depositMonths, boolVariable) {
let percent = percentAge / 100;
let depositTotal = initialSum;
for(let i = 0; i <= depositMonths - 1; i++) {
depositTotal += (percent / 12) * depositTotal;
}
return depositTotal;
};
console.log(calculateDeposit(100000, 10, 2, true));
Решение №2
let calculateDeposit = function (initialSum, percentAge, depositMonths, boolVariable) {
let percent = percentAge / 100;
let depositTotal = 0;
let depositTotalMonth = initialSum;
if(!boolVariable) {
depositTotal = (percent / 12) * depositMonths * initialSum;
depositTotal += initialSum;
return Math.floor(depositTotal);
}
else {
for(let i = 0; i <= depositMonths - 1; i++) {
depositTotalMonth += (percent / 12) * depositTotalMonth;
}
return Math.floor(depositTotalMonth);
}
};
console.log(calculateDeposit(100000, 10, 2, true));
const culculatePercent = percent => percent / 12 / 100;
let calculateDeposit = function (deposit, percent, months, isCapitalized) {
const percentYear = culculatePercent(percent)
if (isCapitalized) {
let capDeposit = deposit;
let sumPercent = 0;
for (let i = months; i > 0; i--) {
capDeposit += percentYear * capDeposit;
}
return Math.floor(capDeposit);
}
return Math.floor(percentYear * months * deposit + deposit);
};