Я делаю приложение, которое дает клиентам и примерное предложение по кредиту (позднее они рассчитываются другими бэк-офисными системами). Я получил некоторый код от финансовой фирмы, для которого мы делаем калькулятор. Моя проблема в том, что я не понимаю часть кода, которая вычисляет годовую процентную ставку (включая стартовую и месячную плату).Расчет годовой процентной ставки (нужна некоторая помощь с унаследованным кодом)
Это может быть этот метод они используют, но я не могу сказать: http://www.efunda.com/math/num_rootfinding/num_rootfinding.cfm#Newton_Raphson
код работает правильно, но я действительно ненавижу создания приложения на код, который я не в полной мере понять и/или доверия. Окончательный ответ будет исходным кодом, который делает то же самое, но с комментариями и понятными именами переменных (я не исключаю этого :-) Все идеи приветствуются - возможно, у кого-то есть ссылка на статью, которая объясняет это.
(обратите внимание, что я не нахожусь отнюдь не математикой или финансовой) профессионалом
[snip]
int n = numberOfPayments;
double a = (amount/(monthlyPayment * Math.Pow(n, 2)) - (monthlyPayment/amount));
double d = 0;
if (a == 0)
{
d = 0;
}
else
{
for (int qq = 0; qq < 20; qq++)
{
double b = amount + (monthlyPayment/a) * (1 - (Math.Pow((1 + a), -n)));
double c = amount + (monthlyPayment/a) * ((n * (Math.Pow((1 + a), (-n - 1)))) - ((1 - (Math.Pow((1 + a), -n)))/a));
d = a - (b/c);
double aa = a;
double dd = d;
a = d;
if (Math.Abs(aa - dd) < Math.Pow(10, -5)) { break; }
}
}
double apr = ((Math.Pow((1 + d), 12)) - 1) * 100;
apr = Math.Round(apr * 100)/100;
[/snip]
выше, верно, что исходный код пытается вычислить «apr» итеративно, останавливаясь либо на 20 шагов, либо на следующем этапе произойдет изменение не более 10^-5. Я не уверен, является ли исходный код точным; в лучшем случае это непрозрачно. – Borealid
Это не может быть точным. Я пробовал, и это не сработало для меня. Возможно, я допустил ошибку в расшифровке, правда, но я сделал вывод, что, предположительно, эквивалентный код из определений, который не похож на код вопроса. Первая производная, в частности, не выглядит корректной * вообще *. – Allen
Впечатляющий Аллен - большое спасибо! Я должен признать, что некоторые из моих математических разрядов вашего сообщения потеряны на мне, но код Groovy, в частности, сделал мне несколько вещей более ясными. В отрывке, который я опубликовал, «ежемесячный платеж» рассчитывается точно так же, как вы публикуете (но я только разместил часть кода, с которым мне было трудно понять). Отсканированный фрагмент работает, я проверял некоторые другие аналогичные калькуляторы в Excel и javascript (но я ценю, что я мог бы быть мутным, так как он немного ушел из контекста) –