Вечный вопрос 11/11


#1
var calculateDeposit = function (startCapital, percent, amountOfTime, capitalisation) {
var total=startCapital;
if (!capitalisation) {
  startCapital*=(100+percent/12*amountOfTime)/100;
} else {
  for (var i=1;i<=amountOfTime;i++) {
    startCapital*=(100+percent/12)/100;
  }
}
return Math.floor(startCapital);
};
var getProfitableDeposit=function(deposit, time,percentForUsual,percentForCapitalisation){
  var first=calculateDeposit(deposit,percentForUsual,time,false); 
  var second=calculateDeposit(deposit,percentForCapitalisation,time,true);
  var str='';
  if (first<second) {
    str='Выбирай капитализацию. Заработаешь ' + first;
  } else if (first>second) {
    str='Выбирай обычный вклад. Заработаешь ' + second;
  }
  return str;
  };

Что не так? Предыдущая функция все проверки прошла, эта не прошла ни одной, что не правильно?


#2


проблема в том, что у данной задачи есть 2 правильные формулы, и через *= не принимает решение. а вывод строки одинаковый и там и там


#3
if (first > second) {
    str='Выбирай обычный вклад. Заработаешь ' + first;
  } else {
    str='Выбирай капитализацию. Заработаешь ' + second;
  }

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

и вот это выдает длинное дробное число, которое потом умножается на исходный капитал и округляется в меньшую сторону, поэтому проверка не совпадает.
startCapital *= (100 + percent / 12 * amountOfTime) / 100;

если раскрыть скобки, то всё работает
startCapital *= 1 + percent / 12 * amountOfTime / 100;

видимо, это не одно и тоже
попробуйте в консоли
(100 + 7.2 / 12 * 18) / 100
и
1+ 7.2 / 12 * 18 / 100
результат будет разный

var total=startCapital;
что-то лишнее осталось


#4

Ага, входящее значение разное, возвращаемое из функции (после Math.floor) - одинаковое. Не путайте человека. Это округление там для того и стоит.
Вбейте сами в консоль
Math.floor((100 + 7.2 / 12 * 18) / 100);
Math.floor(1 + 7.2 / 12 * 18 / 100);


#5

Вы не поняли пример…

image

и второй случай

image
а тут у нас целое получилось :slight_smile:


#6

а, ясно. ну это очередной камень в огород к тому, кто переделал задание =)
раньше там был Math.round.


#7

Да просто когда идет такое вычисление значения на которое надо домножать *= надо быть осторожным и помнить про ограничения js. он не всегда точно считает.

image


#8

хорошо бы еще это в курсе оговаривалось, что нужно избегать формул с *= если у задачи есть вариативность решения, как конкретно в этой задаче.


#9

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

Может быть это было бы полезно, не сразу в самом начале, а потом - по завершении основных курсов, как особенности языка, чтобы никого не напугать. Или выдавать информацию порциями - по типу а вы знаете что… :slight_smile: