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

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

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

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

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);
};
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;
};
как-то так

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

мой вариант

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

Два варианта без лишних переменных (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);
};

Вопрос, у меня не проходит 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…

Раньше там в ТЗ 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);
};
4 лайка

Большое спасибо!)
Видимо из-за того что раньше в ТЗ был Math.round я был уверен, что именно с ним и нужно решать.
x - сумма %, ввел просто для наглядности.

var calculateDeposit = function (startSum, percent, depositTime, isCapitalization) {
  if (!isCapitalization) {
    var depositSum = (percent / 100 / 12) * depositTime * startSum + startSum;
  } else {
    for (var i = 0; i < depositTime; i++) {
     depositSum = startSum += (percent / 100 / 12) * startSum;
    }
  }
  return Math.floor(depositSum);
};

Мой вариант:

Код
var calculateDeposit = function (sum, percent, period, isCapital) {  
    if (isCapital) {
      for (var i = 0; i < period; i++) {
        sum += sum * (percent/1200);
        }       
      }    
    else {
      sum += sum * ((percent/1200) * period);
      }  
    return Math.floor(sum);
};

Мой код в 2 строчки без циклов (извините, не разобралась, как красиво вставить код)

Сводка

`
var calculateDeposit = function (cash0, rate, period, ifCapitalize) {
var cash1 = cash0 * (1 + (rate / 100) / 12 * period);

if(ifCapitalize) {
  cash1 = cash0 * ((1 + (rate / 100) / 12) **  period);
  }

return Math.floor(cash1);
};`

1 лайк

Делюсь своим решением:
let calculateDeposit = (sm,pg,sr,f)=> {

 let pm = (pg/12)/100; // процент за месяц, от 1

 let pp = (a) =>(a=sm*(pm*sr+1),Math.floor(a));// без капитализации
 let cp = () =>(sm*=(1+pm),Math.floor(sm)); // с капитализацией 1 месяц

 return (!f)?pp():Array(sr).fill().reduce(a=>a=cp(),0);

};

скрывать не умею, вставлю пока так, мое решение, вдруг кому-нибудь будет полезно

var calculateDeposit = function (startSum, percent, period, isCapital) {

var sumDeposit = startSum;

if (isCapital) {

for (var i = 0; i < period; i++) {
  
sumDeposit += Math.floor((percent / 12 * 0.01) * sumDeposit);

  } 

} else {
    
sumDeposit = startSum + (percent / 12 *  period * 0.01) * startSum;

  }

return Math.floor(sumDeposit);
};

Что бы скрывать надо сначала нажать на опции (шестеренка) и выбрать пункт скрыть детали, дальше думаю разберешься

1 лайк

Мой вариант :

Как прятать то?

Это-ж гениально! но каким образом программа сeммирует dep при условии isK? Вообще не ясно. Обычно перед if мы ставили какую-то новую переменную, с нулевым значением, что бы потом в неё суммировалось. А у вас этого вообще нету, и всё работает!

ну нам надо найти увеличенную входную переменную, почему бы ее напрямую не увеличить без буфера и не засоряя память? вроде ж логично

2 лайка

Отличное решение, только в конце не round a floor

var calculateDeposit = function (oneSum, percentEars,timeСontribution, 
capitalization) {
  var continSum;
  var percent;
  var plain;
  if (capitalization == false) {
   percent = (percentEars / 12) * timeСontribution;
   plain = oneSum * (percent / 100);
   continSum = Math.floor(plain + oneSum);
    }else{
      percent = (percentEars / 12);
      for (var i = 1; i <= timeСontribution; i++) {
      plain = oneSum * (percent / 100);
      var twoSum = plain + oneSum;
      plain = twoSum * (percent / 100);
      oneSum = twoSum;
      }
      continSum = Math.floor(twoSum);
    }
return continSum;
};