Ежемесячный расчет кредита с использованием Math.Pow

Я пытаюсь рассчитать ежемесячный платеж по кредиту, используя эту формулу:

Формула кредита

Где L — сумма кредита, R — ежемесячная процентная ставка, N — количество платежей.

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

double loanAmount = double.Parse(txtLoanAmount.Text) - double.Parse(txtDownPayment.Text);
double interestRate = (double.Parse(txtInterestRate.Text) / 100) / 12;  
double loanPeriod = double.Parse(txtLoanPeriod.SelectedValue) * 12;

Тогда вот как у меня сейчас написана формула:

Answer = loanAmount * interestRate / 1 - Math.Pow(1 / 1 + interestRate, loanPeriod);

Я не слишком хорошо знаком с функцией math.pow (думаю, я использовал ее однажды раньше), поэтому я не уверен, правильно ли я ее использую. Если у кого-то есть какие-либо предложения, мы будем очень признательны!


person Dubisttot    schedule 01.03.2018    source источник
comment
`Math.Pow(value, power), вам нужно позаботиться о приоритете оператора, то есть умножения и деления перед сложением и вычитанием, по возможности используйте скобки.   -  person IvanJazz    schedule 01.03.2018
comment
Не смешивайте целочисленную математику и числа с плавающей запятой. Вы должны вводить 1.0 вместо 1 (есть разница). Также, если вас интересует точность, используйте тип decimal вместо double.   -  person Ron Beyer    schedule 01.03.2018


Ответы (1)


Как упоминалось в некоторых из предыдущих комментариев, приоритет оператора будет проблемой в вашем коде.

Насколько я понимаю вашу формулу, вы хотите, чтобы она читалась так;

Answer = (loanAmount * interestRate) / (1.0 - Math.Pow(1.0 / 1.0 + interestRate, loanPeriod));

Это должно исправить ваш приоритет, а также решить любые математические проблемы с плавающей запятой, которые могут возникнуть (обратите внимание на изменение с 1 -> 1.0)

Как упоминал Рон в комментариях, вы можете также рассмотреть возможность изменения с double на decimal для точности.

person Andrewki    schedule 01.03.2018
comment
Спасибо за предложение. Это помогло мне приблизиться к ответу, мне также нужно было ввести отрицательный знак перед силой, и я получил правильный номер! - person Dubisttot; 01.03.2018