Для “Вечного вопроса” копирую код из “Деньги к деньгам”, там этот код проходит проверку.
Код из первой задачи
var calculateDeposit = function (deposit, percent,time,capitalization) {
if (!capitalization){
var result = deposit + Math.floor (percent/100/12timedeposit)
} else if (capitalization) {
sum = 0;
var dep = deposit;
for (i=1;i<=time;i++){
sum += Math.floor (percent/100/12*dep);
console.log (sum);
dep+=sum;
}
result = deposit+sum
}
return result;
};
В результате во второй программе этот код не работает, пробовала разными путями: внутри функции делала функцию для вычисления капитализации, сначала писала функцию для вычисления капитализации, а потом в сравнении вставляла ее результат. Бесполезно.
Помогло сменить в формуле dep на deposit, хотя я не понимаю, почему. Но все равно третья проверка не работает.
Код из второй задачи
var getProfitableDeposit = function (deposit, time,percent,percentCap) {
var result = deposit + Math.floor (percent/100/12*time*deposit);
sum = 0;
var dep = deposit;
for (i=1;i<=time;i++){
sum += Math.round (percentCap/100/12*deposit);
dep+=sum;
}
var result2 = deposit+sum;
if (result>result2){
var message = 'Выбирай обычный вклад. Заработаешь '+result;
} else {
message = 'Выбирай капитализацию. Заработаешь '+result2;
}
return message;
};
ошибка в том, что вы изобрести повторно велосипед решили.
у вас же есть работающий код, так вызовите его внутри функции c аргументами, которые являются параметрами родительской функции. или инкапсулируйте одно в другое, решайте
function calculateDeposit(deposit, percent, time, capitalization) { ... }
function getProfitableDeposit(deposit, time, percent, percentCap) {
var neCap = calculateDeposit(deposit, percent, time, false);
var cap = calculateDeposit(deposit, percentCap, time, true);
...
}
и сравнивайте потом эти результаты
а так вы начали заново писать код, еще и Math.round откуда-то появился, хотя его не было в первом коде и прочие ошибки.
var calculateDeposit = function (deposit, percent,time,capitalization) {
if (!capitalization){
var result = deposit + Math.floor (percent/100/12*time*deposit)
} else if (capitalization) {
sum = 0;
var dep = deposit;
for (i=1;i<=time;i++){
sum += Math.floor (percent/100/12*deposit);
dep+=sum;
}
result = deposit+sum;
}
return result;
};
var getProfitableDeposit = function (deposit, time, percent, percentCap){
var simple = calculateDeposit (deposit,percent,time,false);
var capitalization = calculateDeposit (deposit,percentCap,time,true);
var message = '';
if (simple>capitalization){
message = 'Выбирай обычный вклад. Заработаешь '+ simple;
} else {
message = 'Выбирай капитализацию. Заработаешь ' + capitalization;
}
return message;
}
все равно, во-первых, пришлось заменить dep на deposit, хотя в “Деньги к деньгам” используется именно dep, во-вторых, третья проверка не проходится.
Если вписать функцию calculateDeposit внутрь getProfitableDeposit, ничего не меняется, так же третья проверка не работает
так у вас и первый код нерабочий(5/6). вы слукавили.
result вообще вне области видимости, вспомогательные переменные какие-то мутные: dep, sum - зачем они? если разобраться и result не нужен. загляните в оригинальные топики, там по сути 2 реализации этого алгоритма есть (через *= и +=)
else if еще зачем то прилепили к булеву значению. у него вообще 2 значения всего.
открывать в случае отчаяния
var calculateDeposit = function(deposit, percent, time, capitalization) {
if (!capitalization) {
deposit += deposit * percent * time / 100 / 12;
} else {
for (var i = 0; i < time; i++) {
deposit += deposit * percent / 100 / 12;
}
}
return Math.floor(deposit);
};
вторая часть программы верная.
еще раз задам наводящие вопросы: зачем переменные sum и dep, что в них записывается? (я то знаю ответ, но напишите сюда, чтобы видеть ваш ход мыслей)
еще такой момент: в тз написано - “Функция должна возвращать итоговую сумму депозита, округлённую до рублей с помощью Math.floor()”
почему вы округляете промежуточный вариант, а не итоговую сумму, как описано в ТЗ?
@GreenLera внесу предложение к проверке по Деньги к деньгам: изменить проверки на большее количество тестов с капитализацией.
Потому что из 6 проверок:
3 без капитализации
1 с капитализацией но 1 месяц (что равно без капитализации)
1 проверка на 0 процент
1 проверка на капитализацию за 2 месяца (что неполноценно при округлении)
Итого: 5 проверок из 6 не проверяют капитализацию, а последняя имеет ограничения, ввиду краткости цикла (всего 2 итерации).
В итоге человек проверку прошел и считает свой код отлично написанным, т.к. он прошел тесты, хотя по факту половина задания выполнена неверно.
Вот мое решение, ни каких сложностей в решении не возникло или может я не все учла, но проверку прошло с первого раза:
var calculateDeposit = function(startAmount, rate, term, capt){
if (capt){
for(var i = 1; i <= term; i++) {
startAmount += startAmount*(rate/100/12);
}
} else {
startAmount = startAmount + startAmount*(rate/100/12*term);
}
return Math.floor(startAmount);
};