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


#42

4я проверка не проходит, что не так?

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

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

Код

var calculateDeposit = function(depFirstSum, percent, depMonth, isCap){
if (isCap){
return Math.round(depFirstSum * (1 + percent * 0.01 /12));
}
else{var p = depFirstSum * depMonth * percent/ 100 / 12;
return Math.round(depFirstSum += p);}
};


#43

Что с вашим редактором +100500 раз проверил код аналогичен, но не работает ? при в кладе с капитализацией на 2 месяца
var calculateDeposit = function (initialAmount, simplePercent, duration, complexPercent) {
var totalDeposit;
var profit=0;
if (complexPercent) {
for (var i=0; i<duration; i++) {
profit= (simplePercent/12*0.01)*initialAmount;
initialAmount+=profit;
return Math.round(initialAmount);

}

}
else {
profit=(simplePercent0.01/12duration)*initialAmount;
initialAmount=initialAmount+profit;
return Math.round(initialAmount);
}
return totalDeposit;
};


#44

Оформляйте код в сообщении правильно, чтобы не получалось так:


#45

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


#46

Вы не в консоль должны выводить рассчитанное значение.


#47

Спасибо


#48
Мое решение, хотя тут все решения похожи.
var calculateDeposit = function (initialDeposit, percent, term, capitalization) {
  percent /= 100;
  if (!capitalization) {
    var sum = initialDeposit + (percent / 12) * term * initialDeposit;
    } else {
      for (var i = 0; i < term; i++) {
        sum = initialDeposit + (percent / 12) * initialDeposit;   
        initialDeposit = sum; 
        }
      }
    return Math.round(sum);
};

#49

Сделал так.

вопрос: Можно ли объявить переменную, которая будет хранить код : (percent / 12) * amount; ?
Пытался так сделать, но одну проверку сразу не проходит.

js

var calculateDeposit = function (amount, percent, months, capital) {
percent /= 100;

if(capital){
for(var i = 0; i < months; i++){
amount += (percent / 12) * amount;
}
}else{
amount += (percent/12) * months * amount;
}
return(Math.round(amount));
};


#50

А почему не рассказали про стрелочные функции?


#51

Стрелочные функции решают отдельные задачи, которые перед нами пока не стоят, поэтому их время ещё не пришло)
Тем более мы пока пишем на ES5, а стрелочные функции ES6


#52

А почему не начали с ES6?) babel.js же позволяет писать на нем, не оглядываясь на поддержку


#53

Возможно, не совсем стандартное решение :man_cartwheeling::

Summary
var calculateDeposit = function (initialDeposit, annualPercent, depositTerm, isInterestCapitalized) {
  for (var deposit = initialDeposit, term = 1; term <= depositTerm; term++) {
    isInterestCapitalized ? deposit *= 1 + annualPercent / 100 / 12 : deposit += initialDeposit * annualPercent / 100 / 12;
  }
  return Math.round(deposit);
}

#54

Подскажите пожалуйста, что я делаю не так.
Написал такой код:

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

}
else {
var allPercent = (percent / 12) * time * deposit;
var result = Math.round(deposit + allPercent);
}
console.log(result);
return result;

};

Проверяю результаты работы консоль логами и вызовом функции с нужными аргументами, результаты верные, и соответствуют ответам к задаче. Но когда запускаю проверку Кексом, то мне выдаёт какие-то сумасшедшие цифры, хотя консолью я проверил все значения, и они совпадают с ответами.

Возможно я что-то упустил?


#55

Так, я понял свою ошибку, я проценты не перевёл в математические проценты, то есть не помножил percent на 0.01. Исправил.

Но теперь в корне не понятно что не так с 4й проверкой)) результат отличается на единицу…


#56

Сделал так. Подскажите можно ли этот код как то рефакторить?

var calculateDeposit = function (firstAmount, procentYear, timeDeposit, capitalProcent) {
  if(!capitalProcent){
    firstAmount = firstAmount + firstAmount * (procentYear / 12 * timeDeposit) / 100;
  } else {
    for(i = 0; i < timeDeposit; i++) {
        var amountMonth = firstAmount * (procentYear / 12 / 100);
        firstAmount += amountMonth;
      }
    }
  return Math.round(firstAmount);
};

#58
var calculateDeposit = function (initialAmount, percent, time, withCapitalization ) {
  var finalAmount = initialAmount;
  if (withCapitalization) {
    for (var i = 0; i < time; i++) {
      finalAmount*=(percent/12+100)/100;
    }
  }
  else {
    finalAmount*=(percent*time/12+100)/100;
  }
  finalAmount = Math.round(finalAmount);
  return finalAmount;
};
как-то так

#59

вариантов много один из них:

мой вариант

var calculateDeposit = function (initialDeposit, perAmount, depositInMonths, withCapitalization) {
perAmount = perAmount / 100;
if(withCapitalization){
for(var i = 0; i < depositInMonths; i++){
initialDeposit = initialDeposit + (perAmount / 12) * initialDeposit;
}
} else {
initialDeposit += (perAmount / 12) * depositInMonths * initialDeposit;
}
return Math.round(initialDeposit);
};


#60

Два варианта без лишних переменных (for & while):

//FOR

var calculateDeposit = function (deposit, percent, month, capitalize) {
if (capitalize) {
for (var i = 1; i <= month; i++) {
deposit += deposit * percent / 1200;
}
} else {
deposit *= 1 + percent / 1200 * month;
}
return Math.round(deposit);
};

//WHILE

var calculateDeposit = function (deposit, percent, month, capitalize) {
if (capitalize) {
while (month > 0, month–) {
deposit += deposit * percent / 1200;
}
} else {
deposit *= 1 + percent / 1200 * month;
}
return Math.round(deposit);
};


#61

Вопрос, у меня не проходит 2 проверки из 6.

Вот мой код
var calculateDeposit = function (dep, pr, per, isK) {
  var x = 0;
  if (!isK) {
    x = (pr / 12 * 0.01) * per * dep;
  }
  if (isK) {
    for (var i = 1; i <= per; i++) {
      x += (pr / 12 * 0.01) * (dep + x)
    }
  }
  return Math.round(x + dep);
};

Такие же результаты если беру любой другой код из ответов выше.

Не проходит конкретно вот здесь:59

Например, берем первую из этих проверок:
Капитализации нет, процент годовой - 10%, срок 2 месяца.
10% / 12 = 8,333333333…, далее умножаем на 2 месяца: 8,333333333 * 2 = 1,66666666667…
Естественно Math.round() округлит в большу сторону, т.е. последняя цыфра будет 7, а не 6.
Наверное здесь какие то заковырки с js…


Испытание:Вечный вопрос
#62

Раньше там в ТЗ Math.round был, теперь Math.floor. вроде решит ваш вопрос. Нейминг у вас дичь конечно =)

и еще, зачем вводить абстракцию в виде x, чтобы на выводе все равно получать не её, а абстракция + депозит?
не проще ли было переписать локальную переменную?

например вот так
var calculateDeposit = function (dep, pr, per, isK) {
  if (!isK) {
    dep += pr / 12 / 100 * per * dep;
  }
  if (isK) {
    for (var i = 1; i <= per; i++) {
      dep += pr / 12 / 100 * dep;
    }
  }
  return Math.floor(dep);
};