Испытание: Деньги к деньгам


#1

Делюсь своим решением:

Code

var calculateDeposit = function (initialdeposit, annualpercent, investperiod, capitalize) {
if (capitalize) {
for (var i=0; i<=investperiod; i = i + 1) {
var currentdeposit = initialdeposit;
percent = (annualpercent*0.01/12)*currentdeposit;
initialdeposit += percent;
};
return Math.round(currentdeposit);}

var percent = (annualpercent*0.01/12) * investperiod * initialdeposit;
initialdeposit += percent;
return Math.round(initialdeposit);
};
calculateDeposit ();


#2

У меня получилось как-то так!

Code

var calculateDeposit = function (start, percent, months, isCapitalized) {
if (isCapitalized) {
var month = start + (start * ((percent/100) / 12));
for (var i = 2, sum = month; i <= months; i++) {
sum += month * ((percent/100)/12);
}
}
else {
var sum = start + (start * (((percent/100) / 12) * months));
}
return Math.round(sum);
}


#3

Прячьте код с помощью спойлера. Курс новый, не думаю, что многим хочется видеть подсказку сразу.

Код
var calculateDeposit = function (sumDeposit, percent, term, isCapitalize) {
  var totalDeposit;
  var sumPercent = 0;
      if (isCapitalize) {
        for (var i = 0; i < term; i++) {
          sumPercent = sumDeposit * (percent / 12 * 0.01);
          sumDeposit += sumPercent;
        }
      } else {
      sumPercent += sumDeposit * (percent / 12 * term * 0.01);
      sumDeposit += sumPercent;
      }
  
  totalDeposit = Math.round(sumDeposit);
  
  return totalDeposit;
};

#4

У меня получилось так

код

var calculateDeposit = function (deposit,percent,date,capitalez) {
if(capitalez){
for(var i = 1;i<=date;i++){
var percentNew = (percent0.01)/12;
var percentDeposit = deposit * percentNew
deposit+=percentDeposit
}
return Math.round(deposit );
}
else{
percentNew=(percent
0.01/12) * date;
var sum1 = deposit * percentNew;
deposit +=sum1
return Math.round(deposit);
}
};


#5

Добрый вечер!
Подскажите, пожалуйста, почему в цикле используется параметр ‘term’ и почему в теле цикла он никак не фигурирует?

Спасибо.


#6

При расчете депозита без капитализации сумма процентов каждый месяц не меняется. Поэтому вы умножаете сумму процентов на количество месяцев ( у меня это term).
При расчете депозита с капитализацией ситуация другая. Сумма процентов каждый месяц отличается. И умножать на число месяцев уже нельзя. И поэтому используется цикл, только чтобы суммировать полученные проценты.


#7

Я правильно понял, что выражение
sumPercent = sumDeposit * (percent / 12 * 0.01); - это расчет процентов за каждый месяц в случае с депозитом по капитализации?
А цикл нам нужен для того, чтобы расчеты выполнялись пока переменная “i” не достигнет значения параметра “term”?


#8

Спасибо огромное за помощь! :+1:
Это для меня очень важный момент в понимании решения подобных задач))


#9
код

var calculateDeposit = function (deposit, percent, duration , withCapitalization) {
var profit = (1 + percent * 0.01 / 12 * duration);
if (withCapitalization) {
profit = Math.pow((1 + percent * 0.01 / 12), duration);
}
return Math.round(deposit * profit);
};


#10

Мой вариант. Мне показалось, что так проще всего:

Решение
var calculateDeposit = function (deposit, percent, period, isCapitalized) {
  var profit = deposit / 100 * percent / 12 * period;
  var result = deposit + profit;
  if (isCapitalized) {
    result = deposit;
    for (var i = 0; i < period; i++) {
      profit = result / 100 * percent / 12;
      result += profit;
    }
  }
  return Math.round(result);
};

#11
Мое решение

var calculateDeposit = function (deposit, rate, month, isCapitalized) {
rate = rate / 100;
if (isCapitalized){
for(i=0; i<month;i++) {
deposit += (rate/12) * deposit;
}
return Math.round(deposit);
}
return Math.round( deposit +((rate/12) * month * deposit) );
};


#12

Никто не подскажет, где ж у меня закралась ошибка, что одно из 6 заданий (Результат работы функции calculateDeposit равный 101667 не совпадает с ожидаемым значением 101674) не выполняется…

var calculateDeposit = function (startDeposit, procent, period, capitalProcent) {

    procent = procent / 100;

    var advantage;

  if (capitalProcent === false) {
    
		advantage = ((procent / 12) * period * startDeposit) + startDeposit;
  
  } else {
    
    advantage = startDeposit + (procent / 12) * startDeposit;

    for (var i = 1; i < period; i++) {

    	advantage = advantage + (procent / 12) * startDeposit;

    }
    
  }

    return Math.round(advantage);

};

#13
Код

var calculateDeposit = function (
initialContribution, procents,
term, capitalization) {
var total = 0;

if(capitalization) {
for (var i = 1; i <= term; i++) {
total = Math.round(initialContribution + ((procents/100)/12)initialContribution);
initialContribution = total;
}
} else {
total = Math.ceil(initialContribution + (initialContribution
((procents/12)*term)/100));
}
return total;
};

Проходит все проверки кроме одной, а именно: "Начальная сумма: 100000 рублей, годовой процент: 10%, вклад на 2 мес., с капитализацией, ожидаемый результат: 101674 рублей.

Результат работы функции calculateDeposit равный 101673 не совпадает с ожидаемым значением 101674."

Явно проблема в округлении, пробовал округлять через ceil и floor, такая же ерунда, только в одном случае получается на единицу больше… В чем проблема может быть? как это решить?


#14

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

Округление можно написать один раз, только здесь:


#15

да, помогло, спасибо)


#17

Вроде получилось аккуратно. Может кому пригодится.

Мой вариант

var calculateDeposit = function(depositAmount, userPercent, time, isCapitalize) {
var percent = userPercent * 0.01;
var total = (percent / 12) * time * depositAmount + depositAmount;
if(isCapitalize) {
total = depositAmount;
for(var i = 1; i <= time; i++) {
total += (percent / 12) * total;
}
}
return Math.round(total);
};


#18

У меня вышло так:

code
var calculateDeposit = function (startingSum, percent, termOfdeposit, isСapitalization) {
  if (!isСapitalization) {
    startingSum += (startingSum * percent / 100 * termOfdeposit / 12);
    return Math.round(startingSum);
  }

  for (i = 0; i < termOfdeposit; i++) {
    startingSum += startingSum * percent / 100 / 12;
  }
  return Math.round(startingSum);
}

У меня вопрос к автору (или авторам) курса. Почему вы в заданиях в первую очередь предлагаете использовать не объявления функций, а функциональные выражения?


#19

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

var calculateDeposit = function (startDeposit, percent, months, isCapitalization) {
if(isCapitalization) {
totalDeposit = startDeposit;
for(var i = 1; i <= months; i++){
totalDeposit = totalDeposit + totalDeposit * (((percent *0.01) /12) * months);
return Math.round(totalDeposit)}
} else {
totalDeposit = startDeposit + startDeposit * (((percent *0.01) /12) * months);
return Math.round(totalDeposit);
}

};


#20

Проходит 4 проверки из 5, причем одна с капитализацией считает верно, а вторая нет,
подскажите, в чем ошибка:persevere:

var calculateDeposit = function (startAmount, persentForYear, periodOfDepositInMonth, capitalization) {

if (capitalization) {
for (var i = 1; i <= periodOfDepositInMonth; i++){
var hhh = startAmount + (0.01*persentForYear/12)*startAmount;
finalMoney = hhh + (0.01*persentForYear/12)*hhh;
}
return(Math.round(finalMoney));
} 
else {
var finalMoney = startAmount +startAmount*(0.01 * 
persentForYear/12)*periodOfDepositInMonth;
}


return(Math.round(finalMoney));
}

#21

Эту строку объясните. Что здесь происходит?