var simpleDeposit = function(startDeposite, percent, months) {
var generalPercent = startDeposite * (percent / 12 * months + 100) / 100;
return Math.floor(generalPercent);
}
var smartDeposite = function(startDeposite, percent, months) {
for (var i = 1; i < months; i++) {
startDeposite *= (100 + percent / 12) / 100;
}
return Math.floor(startDeposite);
}
var getProfitableDeposit = function (startDeposite, months, simplePercent, smartPercent) {
var firstVar = simpleDeposit(startDeposite, simplePercent, months);
var secondVar = smartDeposite(startDeposite, smartPercent, months);
console.log(firstVar);
console.log(secondVar);
if (firstVar > secondVar) {
return 'Выбирай обычный вклад. Заработаешь ' + firstVar;
}
else{
return 'Выбирай капитализацию. Заработаешь ' + secondVar;
}
}
Извините, я снова не могу победить эту программу. Помогите ауту найти причину, почему не работает корректно программа при вкладе с капитализацией
@GreenLera подозрение на нерабочую (третью) проверку с капитализацией
Задание поменяли, теперь у меня тоже не работает:
моё
let calculateDeposit = function(deposit, percent, duration, isCapitalization) {
if (!isCapitalization) {
deposit *= (100+percent/12*duration)/100;
} else {
for (let i = 0; i < duration; i++) {
deposit *= (100+percent/12)/100;
}
}
return Math.round(deposit);
}
let getProfitableDeposit = function(deposit, duration, simplePercent, complexPercent) {
let simple = calculateDeposit(deposit, simplePercent, duration, false);
let complex = calculateDeposit(deposit, complexPercent, duration, true);
let recommendedType = 'капитализацию';
let finalAmount = complex;
if (complex <= simple) {
recommendedType = 'обычный вклад';
finalAmount = simple;
}
return `Выбирай ${recommendedType}. Заработаешь ${finalAmount}`;
}
getProfitableDeposit(250000, 14, 7, 6.8);
Здравствуйте, я сейчас проверила, у меня все проверки проходят.
1 - надо округлять теперь вниз через floor
2 - можете объяснить свою формулу? Почему именно такое решение? Почему вы прибавляете 100?
так, при применении Math.floor теперь выбивается вторая проверка, а третья проходит нормально.
повторюсь, что при ручном выводе результаты корректны. т.е. нормально выбивает шаблонную строку, арифметика верна.
прибавлять 100, это все равно что прибавлять 1, разница в том, что мы делим на 100, т.е. приводим к долям (от процентов) либо обе стороны слагаемых до умножения на величину депозита, либо 1 прибавляем к приведенному значению в долях, а потом умножаем на стартовый депозит.
полное объяснение под катом
Простой депозит: считаем проценты:
Годовой процент делим на 12, чтобы получить месячный. умножаем его на месяцы.
yearPercent / 12 * months
Столько процентов мы получим за весь срок вклада. У нас уже было 100% от депозита. к ним добавляем посчитанное.
100 + yearPercent / 12 * months
Делим на 100, чтобы получить размерность в долях. Вот во столько раз увеличится наша сумма.
(100 + yearPercent / 12 * months) / 100
Осталось умножить это на сумму, чтобы узнать скока получим.
startSum * (100 + yearPercent / 12 * months) / 100
Запишем сам депозит в локальную переменную startSum (та, которая у нас параметр).
startSum = startSum * (100 + yearPercent / 12 * months) / 100
Сократим запись
startSum *= (100 + yearPercent / 12 * months) / 100
Сложный процент: тут нужен цикл:
Каждый месяц идет пересчет, так что цикл ограничен количеством месяцев
for (var i = 1; i <= months; i++)
ну или for (var i = 0; i < months; i++)
Нам надо знать месячный прирост, т.е. прирост за каждый месяц: это yearPercent / 12
(пока в процентах )
У нас уже было 100%, к ним мы добавляем месячный прирост в процентах : 100 + yearPercent / 12
Возвращаем размерность дроби к долям : (100 + yearPercent / 12) / 100
Умножаем на собственно сумму депозита и узнаем, сколько получаем в первую итерацию нашего цикла первый месяц
startSum * (100 + yearPercent / 12) / 100
Перезапишем значение в локальную переменную – параметр.
startSum = startSum * (100 + yearPercent / 12) / 100
Сократим запись:
startSum *= (100 + yearPercent / 12) / 100
по факту имеем 2 правильные формулы:
X = X + X * Y ==>
X += X*Y
X = X (1 + Y) ==> X *= 1 + Y
И вот вторую формулу проверка не принимает. А вывод строки одинаковый и там и там.
вот с этой формулой проверки проходят нормально
let calculateDeposit = function(deposit, percent, duration, isCapitalization) {
if (!isCapitalization) {
deposit += deposit*percent/12*duration/100;
} else {
for (let i = 0; i < duration; i++) {
deposit += deposit*percent/12/100;
}
}
return Math.floor(deposit);
}
let getProfitableDeposit = function(deposit, duration, simplePercent, complexPercent) {
let simple = calculateDeposit(deposit, simplePercent, duration, false);
let complex = calculateDeposit(deposit, complexPercent, duration, true);
let recommendedType = 'капитализацию';
let finalAmount = complex;
if (complex <= simple) {
recommendedType = 'обычный вклад';
finalAmount = simple;
}
return `Выбирай ${recommendedType}. Заработаешь ${finalAmount}`;
}
getProfitableDeposit(250000, 14, 7, 6.8);
zateya
12.Январь.2019 09:00:46
6
for (var i = 1; i < months; i++)
c 0 счетчик цикла, если строгое неравенство.
и проверка пройдет
там вообще неравенства нет, там сравнение
как раз от нуля до длительности будет расстояние в длительность
там либо i = 0 и <
либо i = 1 и <=
подставьте, все равно проверки не пройдут как вы говорите.
zateya
12.Январь.2019 16:51:48
8
Подставила. Прошли. Строгое неравенство это знак меньше в данном случае если строго меньше, то считаем с нуля.
У @neatomaru именно в этом была ошибка.
просто вы не указали, кому отвечаете. дефолтно уведомление приходит последнему в треде.
zateya
12.Январь.2019 17:22:00
10
Странно, я нажимала как раз ссылку Ответить у верхнего сообщения.
все, мы с @zateya разобрались почему так выходит, в общем если у задачи есть решение через *= и +=, то следует применять последнее, если применяется метод Math.floor или Math.ceil. Вопрос в принципе снят.
Я так понимаю Math.floor применяется тут, потому что банкиры жадные и им жалко один рупь, на этом округлении и зарабатывают =)
1 лайк
Вы молодцы!
Да, округление сделано вниз, потому что банки считают каждую копеечку. По рублю с каждого клиента – большая экономия)
Здравствуйте, не проходит 3 проверка. Уже все перепробовал. А предыдущее задание функция без нариканий выполняет. ((((
Помогите понять в чем проблема пожалуйста!
Сводка
var calculateDeposit = function (depositSum, yearPercent, timeOfDeposit, isCapitalisationPercent) {
var finalDeposit = depositSum;
if (isCapitalisationPercent) {
for ( var i = 1; i <= timeOfDeposit; i++) {
finalDeposit = Math.floor(finalDeposit + ((yearPercent / 100) / 12) * finalDeposit);
}
} else {
finalDeposit = depositSum + (((yearPercent / 100) / 12) * timeOfDeposit * depositSum);
}
return(Math.floor(finalDeposit));
};
var getProfitableDeposit = function (depositSum, timeOfDeposit, simplePercent, capitalPercent) {
var one = calculateDeposit(depositSum, simplePercent, timeOfDeposit, false);
var two = calculateDeposit(depositSum, capitalPercent, timeOfDeposit, true);
if (one > two) {
return('Выбирай обычный вклад. Заработаешь ' + one);
} else {
return('Выбирай капитализацию. Заработаешь ' + two);
}
}
var finalDeposit = depositSum; - не нужно
замените все finalDeposit на depositSum
Сводка
let calculateDeposit = function(deposit, percent, duration, isCapitalization) {
if (!isCapitalization) {
deposit += percent/12*duration*deposit/100;
} else {
for (let i = 0; i < duration; i++) {
deposit += percent/12/100*deposit;
}
}
return Math.floor(deposit);
}
let getProfitableDeposit = function(deposit, duration, simplePercent, complexPercent) {
let simple = calculateDeposit(deposit, simplePercent, duration, false);
let complex = calculateDeposit(deposit, complexPercent, duration, true);
let recommendedType = 'капитализацию';
let finalAmount = complex;
if (complex <= simple) {
recommendedType = 'обычный вклад';
finalAmount = simple;
}
return `Выбирай ${recommendedType}. Заработаешь ${finalAmount}`;
}
getProfitableDeposit(250000, 14, 7, 6.8);
Заменил finalDeposit на depositSum, но результат остался тем же (
Сводка
var calculateDeposit = function (depositSum, yearPercent, timeOfDeposit, isCapitalisationPercent) {
if (isCapitalisationPercent) {
for ( var i = 1; i <= timeOfDeposit; i++) {
depositSum += yearPercent / 100 / 12 * depositSum;
}
} else {
depositSum += yearPercent / 12 * timeOfDeposit * depositSum / 100;
}
return(Math.floor(depositSum));
};
var getProfitableDeposit = function (depositSum, timeOfDeposit, simplePercent, capitalPercent) {
var one = calculateDeposit(depositSum, simplePercent, timeOfDeposit, false);
var two = calculateDeposit(depositSum, capitalPercent, timeOfDeposit, true);
if (one > two) {
return('Выбирай обычный вклад. Заработаешь ' + one);
} else {
return('Выбирай капитализацию. Заработаешь ' + two);
}
}
getProfitableDeposit(250000, 14, 7, 6.8);
Сводка
Этот текст будет скрыт
ну у меня ваш исправленный код проходит все тесты, проверьте еще раз
@GreenLera , маленькая оформительская ошибка:
Eleven
17.Август.2020 10:48:49
21
Добрый день!
Измените “Заработаешь” на “Получишь” в выводе ответа.