Использование экспонент с десятичными дробями

Я все еще новичок в изучении С#, и мне было интересно, могу ли я получить некоторую помощь. Я пишу программу C# и формы Windows, чтобы пользователи могли рассчитывать свои ежемесячные платежи и проценты по ипотеке. Уравнение, которое я имею для платежей: Платеж = p * r / (1 - (1 + r) ^ (-n)) Где p - сумма кредита, r - ежемесячная процентная ставка, заданная как число от 0 (для 0 процентов) и 1 (для 100 процентов), n - срок кредита в месяцах. Тогда формула для общей суммы выплаченных процентов: общая сумма процентов = n * платеж -p

Теперь я попытался ввести все эти числа как двойные, используя метод Math.Pow для платежей, и получил неправильные расчеты. Я предполагаю, что скорость ДОЛЖНА быть десятичной, поэтому, когда я пробую их ВСЕ как десятичные, VS не нравится метод «^» или метод math.pow. Итак, мой вопрос: как вы должны использовать десятичные дроби с показателями степени? Для тех, кто хочет увидеть мой текущий код, обратите внимание, что я просто пытаюсь завершить вычисления, прежде чем я начну добавлять дополнительные операторы else.

        decimal amnt = Convert.ToDecimal(txtAMNT.Text);
        string Amount=Convert.ToString(txtAMNT.Text);
        decimal rate = Convert.ToDecimal(txtRATE.Text);
        string Rate = Convert.ToString(txtRATE.Text);
        decimal time = Convert.ToDecimal(txtTIME.Text);
        string Time=Convert.ToString(txtTIME.Text);
        decimal monthpay;
        decimal totalinterest;
        decimal realrate = rate / 100;

        if ((Amount == "")||(Rate == "")||(Time==""))
        {
            MessageBox.Show("Please fill all boxes with numbers");
        }
        else
        {
            monthpay=amnt*realrate/(1-(1+realrate)^(-time));
                totalinterest=time*monthpay-amnt;
            mtbMonPay.Text=monthpay.ToString("c");
            mtbTotalInterest.Text=totalinterest.ToString("c");
        }

person SprJD7903    schedule 22.03.2015    source источник
comment
Почему вы Convert.ToString делаете вещи, которые уже являются строками (например, txtAMNT.Text)?   -  person Sam Axe    schedule 22.03.2015
comment
Decimal.TryParse обычно считается лучше, чем Convert.ToDecimal.   -  person Sam Axe    schedule 22.03.2015
comment
Не знаю, почему, просто так я писал некоторые из своих строк, я знаю, что это уже строка, но я думаю, это то, чему меня учили, я думаю. ИДК я делаю это таким образом большую часть этого времени. Несмотря на это, это не должно влиять на математическую часть кода.   -  person SprJD7903    schedule 22.03.2015
comment
Сэм, это интересно, метод tryparse позволяет мне сделать это как строку и десятичное число? мне это нравится, лол, но тогда как VB сможет определить разницу между ними в виде строки и десятичного числа?   -  person SprJD7903    schedule 22.03.2015
comment
Каковы ваши входные значения, каковы ваши выходные значения и какие выходные значения вы ожидаете?   -  person phoog    schedule 22.03.2015
comment
Кроме того, код, который вы написали, это C #, а не VB.   -  person Sam Axe    schedule 22.03.2015
comment
@phoog - При сумме = 100,00 долларов США, ставке = 5,00%, времени (месяцев) = 24. Эти входные данные должны равняться месячной оплате = 4,39 доллара США, а общему проценту = 5,29 доллара США. Это был пример, который был предоставлен мне.   -  person SprJD7903    schedule 22.03.2015
comment
Извините, я имел в виду VS (Visual Studios), я поменяю, спасибо, Сэм.   -  person SprJD7903    schedule 22.03.2015
comment
Под не нравится ^ вы имеете в виду, что получаете синтаксическую ошибку с указанием Operator '^' cannot be applied to operands of type 'decimal' and 'int' ?   -  person Sam Axe    schedule 22.03.2015
comment
Это 5% годовых? Если это так, то ежемесячная ставка составляет 5/1200, а не 5/100.   -  person phoog    schedule 22.03.2015
comment
Для подавляющего большинства входных данных Math.pow() не может дать в качестве результата точное значение, поэтому нет смысла использовать его с decimal. Приведите входные данные к double.   -  person JLRishe    schedule 22.03.2015
comment
@JLRishe Настоящая причина, по которой нет смысла использовать Pow с десятичным числом, заключается в том, что нет перегрузки, которая принимает десятичные аргументы.   -  person phoog    schedule 22.03.2015


Ответы (2)


Вы должны использовать double для этого вычисления.

Причина, по которой вы получили неправильные результаты, заключалась в том, что вы забыли разделить годовую процентную ставку на 12, чтобы получить месячную процентную ставку.

Decimal не поддерживает возведение в степень. Кроме того, оператор каретки (^) не используется для возведения в степень в C#. ; оператора возведения в степень нет. Вам просто нужно позвонить Math.Pow.

См. также https://stackoverflow.com/a/6426826/385844.

person phoog    schedule 22.03.2015
comment
Ничего себе, если бы вы никогда не указали на это, я, вероятно, в конце концов выбросил бы свой ноутбук в окно. Я пробовал ВСЁ и совершенно забыл разделить на 12. Я думал, что неправильно кодирую, ну да, я просто испортил свою математику, лол. - person SprJD7903; 22.03.2015

double должно быть достаточно точным для точности, с которой вы работаете. Попробуйте заменить все десятичные числа на двойные.

Еще одна проблема — ваша скорость. Реальная ставка - это введенное значение/100, что означает, что 1, которое, как вы сказали, означает 100%, на самом деле заканчивается как 1%.

person Tim    schedule 22.03.2015