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


#1

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

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

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

Где моя ошибка?


#2

ошибка в том, что вы изобрести повторно велосипед решили.
у вас же есть работающий код, так вызовите его внутри функции 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 откуда-то появился, хотя его не было в первом коде и прочие ошибки.


#3
код
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, ничего не меняется, так же третья проверка не работает


#4

так у вас и первый код нерабочий(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);
};

#5

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


#6

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


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

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

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

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


#7

Спасибо за идею, мы учтём.


#8

Вот мое решение, ни каких сложностей в решении не возникло или может я не все учла, но проверку прошло с первого раза:
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);
};


#9

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

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


#10

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


#11

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