"Деньги к деньгам" и "Вечный вопрос"

Для “Вечного вопроса” копирую код из “Деньги к деньгам”, там этот код проходит проверку.

Код из первой задачи

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);
};
1 лайк

тем не менее, проверку проходит

у вас проходит, у меня не проходит, так чтоли?


вторая часть программы верная.
еще раз задам наводящие вопросы: зачем переменные sum и dep, что в них записывается? (я то знаю ответ, но напишите сюда, чтобы видеть ваш ход мыслей)
еще такой момент: в тз написано - “Функция должна возвращать итоговую сумму депозита, округлённую до рублей с помощью Math.floor()”
почему вы округляете промежуточный вариант, а не итоговую сумму, как описано в ТЗ?

@GreenLera внесу предложение к проверке по Деньги к деньгам: изменить проверки на большее количество тестов с капитализацией.
Потому что из 6 проверок:

  • 3 без капитализации
  • 1 с капитализацией но 1 месяц (что равно без капитализации)
  • 1 проверка на 0 процент
  • 1 проверка на капитализацию за 2 месяца (что неполноценно при округлении)
    Итого: 5 проверок из 6 не проверяют капитализацию, а последняя имеет ограничения, ввиду краткости цикла (всего 2 итерации).

В итоге человек проверку прошел и считает свой код отлично написанным, т.к. он прошел тесты, хотя по факту половина задания выполнена неверно.

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);
};

Может кто сказать в чем моя ошибка, последнюю проверку не проходит

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);
};

var getProfitableDeposit = function (deposit, month, percent, percentNew) {
var contribution = calculateDeposit(deposit, percent, month, false);
var capContribution = calculateDeposit(deposit, percentNew, month, true);
if (contribution > capContribution) {
return 'Выбирай обычный вклад. Заработаешь ’ + contribution;
} else {
return 'Выбирай обычный вклад. Заработаешь ’ + capContribution;
}
};

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

да, и в правду нелепо) спасибо

Всё работает.

Сводка

var calculateDeposit = function (startSum, percent, monthCount, capitalisacia) {
var percentInMonth = percent / 12;
var result = 0;
if(!capitalisacia){
result = (monthCount * percentInMonth)/100 * startSum;
result += startSum;
}
else{
for(var i = 1; i <= monthCount; i++){
startSum = (startSum * percentInMonth) / 100 + startSum;
result = startSum;
}
}
return Math.floor(result);
};

Сводка

const culculatePercent = percent => percent / 12 / 100;

let calculateDeposit = (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);
};
let getProfitableDeposit = function(startDeposit, time, percent, precentCapitalization) { 
  let сontribution = Math.floor(startDeposit + ((percent / 100) / 12) * time * startDeposit);
  
  let contributionCapitaliztion = startDeposit;
    for(let i = 0; i < time; i++) {
      contributionCapitaliztion = contributionCapitaliztion + ((precentCapitalization / 100) / 12) * contributionCapitaliztion;
    };
      contributionCapitaliztion = Math.floor(contributionCapitaliztion);
    
    if(сontribution > contributionCapitaliztion) {
      return 'Выбирай обычный вклад. Получишь ' + сontribution;
    } else {
      return 'Выбирай капитализацию. Получишь ' + contributionCapitaliztion;
    };
  };

let calculateDeposit = function (startDeposit, percent, month, boolean) {

percent /= 100;

if (boolean === true) {

  for (let i = 0; i < month; i++) {

     startDeposit += startDeposit *= percent / 12;

  };

} else {

  startDeposit += startDeposit *= month *= percent / 12;

};

return Math.floor(startDeposit);

};

let calculateDeposit = function (deposit, percent, period, capitalization) {
  if (capitalization === false) {
    let total = (percent / 100) / 12 * period * deposit;
    deposit += Math.floor(total)
  } else {
    for (let i = 0; i < period; i++) {
    deposit += deposit * (percent / 100 / 12);
  }
  }
  return Math.floor(deposit);
};