Деньги к деньгам

Подскажите, где я ошибся в коде?
var calculateDeposit = function (startDeposite, percent, months, capitalizase) {
if (!capitalizase) {
var generalPercent = (percent / 100 / 12) * months * startDeposite;
return Math.floor(startDeposite + generalPercent);
}
var summAfterFirstMonth = startDeposite;
if (capitalizase) {
for (var i = 0; i < months; i++) {
summAfterFirstMonth = summAfterFirstMonth + (percent / 100 / 12) * startDeposite;
return Math.floor(summAfterFirstMonth);
}}
};

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

1 Симпатия

Ого, не видел темы, спасибо! А не подскажите почему тогда, раз код неверный, но почти все проверки он успешно проходит?

без капитализации формула правильная (точнее 2 части формулы, вы её на 2 разбили выходит, одна половина в условии, вторая в возврате значения). лаконичнее просто не заводить новую переменную для вывода результата, потому я предлагаю переписать имеющуюся.

  1. generalPercent = (percent / 100 / 12) * months * startDeposite; и Math.floor(startDeposite + generalPercent);
  2. сокращаем: (percent / 100 / 12) * months * startDeposite + startDeposite
  3. startDeposite за скобки:
    startDeposite * ((percent / 100 / 12) * months + 1)
  4. 100 за скобки:
    startDeposite * (percent / 12 * months + 100) / 100 - вот она рыба моей мечты моя формула

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

проверки:

  1. без капитализации - верно
  2. с капитализацией, но 1 итерация - тоже верно
  3. без капитализации - верно.
  4. с капитализацией - 2 итерации - неверно
  5. без капитализации - верно.
  6. процент = 0, так что в любом случае какую бы примерно “правильную” формулу не награмоздили, выйдет стартовый депозит. проверка тупо на равенство входящему значению. можно было бы написать тупо result = startDeposit; - тоже бы прошло =)
1 Симпатия

var calculateDeposit = function (firstSum, percents, monthAmount, capitalized) {
if (!capitalized){
var perMonth = percents / 12 * monthAmount;
return Math.floor(firstSum += firstSum / 100 * perMonth);
} else {
var perMonth = percents / 12;
for (var i = 0; i < monthAmount; i++){
firstSum += firstSum / 100 * perMonth;
}
return Math.floor(firstSum);
}
};

Все работает))

1 Симпатия

а что цикл делает?без него не работает

ну цикл пересчитывает базовую ставку ежемесячно, например.

Почему не проходит проверку с капитализацией для 2 мес? Считает только для одного.

var calculateDeposit = function (initial, yearPercent, months, kapital) {
var finalMoney = initial;
var monthPercent = yearPercent/12; /percent for 1 month/
if (kapital){
for (var i=0; i<months; i++){
return finalMoney = Math.floor(finalMoney + finalMoney*(monthPercent/100));
}
} else {
return finalMoney=Math.floor(finalMoney + (finalMoney*monthPercent/100
)*months);
}
};

формула неправильная.

Вот рабочий код:

var calculateDeposit = function (startSum, procent, month, cap) {
  var balance = startSum;
  if (cap) {
    for ( var i = 1; i <= month; i++ ) {
      balance += balance * (procent / 12) / 100;
    };
  } else {
    balance += balance * (procent / 12 * month) / 100;
  };
  return Math.floor(balance);
};
Работаит
var calculateDeposit = function (balance, percent, months, capitalize) {
  if (capitalize) {
    while (months>0) {
      balance+= (percent/1200)*balance;
      months--;
      }
    return Math.floor(balance);
    }
  balance+= (percent/1200*months)*balance;
  return Math.floor(balance);
};
Решение
let calculateDeposit = function (money, percent, time, isCapital) {
let moneySumm = 0;
  for (let i = 1; i <= time; i++) {
    if (isCapital && time < 2) {
     moneySumm = money + (money * percent / 100 / 12);
    }
    if (isCapital && time >= 2) {
     let moneySumm1 = money + (money * percent / 100 / 12);
     moneySumm = moneySumm1 + (moneySumm1 * percent / 100 / 12);
    } else {
      moneySumm = money + (money * (percent / 100 / 12) * time);
      }
  };
  return Math.floor(moneySumm);
};

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

Решение №1
let calculateDeposit = function (initialSum, percentAge, depositMonths, boolVariable) {
  let percent = percentAge / 100;
  let depositTotal = 0;
  
  if(!boolVariable) {
    depositTotal = (percent / 12) * depositMonths * initialSum;
    depositTotal += initialSum;
  }
  else {
    depositTotal = calculateDepositMonths(initialSum, percentAge, depositMonths, boolVariable);
  }
  return Math.floor(depositTotal);
};

let calculateDepositMonths = function (initialSum, percentAge, depositMonths, boolVariable) {
  let percent = percentAge / 100;
  let depositTotal = initialSum;
  
  for(let i = 0; i <= depositMonths - 1; i++) {
    depositTotal += (percent / 12) * depositTotal;
  }
  return depositTotal;
};

console.log(calculateDeposit(100000, 10, 2, true));
Решение №2
let calculateDeposit = function (initialSum, percentAge, depositMonths, boolVariable) {
  let percent = percentAge / 100;
  let depositTotal = 0;
  let depositTotalMonth = initialSum;
  
  if(!boolVariable) {
    depositTotal = (percent / 12) * depositMonths * initialSum;
    depositTotal += initialSum;
    return Math.floor(depositTotal);
  }
  else {
    for(let i = 0; i <= depositMonths - 1; i++) {
    depositTotalMonth += (percent / 12) * depositTotalMonth;
  }
  return Math.floor(depositTotalMonth);
  }
};

console.log(calculateDeposit(100000, 10, 2, true));
const culculatePercent = percent => percent / 12 / 100;

let calculateDeposit = function (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);
};