2014-02-11 2 views
-1

Я пишу программу, которая рассчитает ежемесячные платежи за кредит. Однако он не дает правильного ответа. Вот мой код:Расчет погашения кредита в C++

#include<iostream> 
#include<cmath> 

using namespace std; 

int main() 
{ 

    double YearlyInt, LoanAmount, Payment, AmountPaid, MonthlyInt; 
    int NumPayments; 

    cout << "Enter the loan amount (LoanAmount) --> "; 
    cin >> LoanAmount; 

    cout << "Enter the YEARLY interest rate as a percentage --> "; 
    cin >> YearlyInt; 

    cout << "Enter number of payments --> "; 
    cin >> NumPayments; 

    cout << "Loan amount: " << LoanAmount << endl; 
    cout << "Yearly Interest Rate: " << YearlyInt << "%" << endl; 
    cout << "Number of Payments: " << NumPayments << endl; 

    MonthlyInt = YearlyInt/12; 

    Payment = MonthlyInt * pow ((1 + MonthlyInt), NumPayments)/(pow((1 + MonthlyInt), NumPayments) -1) * LoanAmount; 
    cout << "Monthly Payment: " << Payment << endl; 

    AmountPaid = Payment * 36; 

    cout << "Amount Paid Back: " << AmountPaid << endl; 
    cout << "Interest Paid: " << (AmountPaid - LoanAmount) << endl; 
    cout << "Program Over" << endl << endl << endl << endl; 
    cout << "Press Enter to end -->" << endl; 

    return 0; 
} 

Программа использует эту формулу:

  MonthlyInt * pow(1 + MonthlyInt, NumPayments) * LoanAmount 
Payment = --------------------------------------------------------------- 
        pow(1 + MonthlyInt, NumPayments) - 1 

Это то, что я получаю в качестве выхода:

Enter the loan amount (LoanAmount) --> 10000 
Enter the YEARLY interest rate as a percentage --> 12 
Enter number of payments --> 36 
Loan amount: 10000 
Yearly Interest Rate: 12% 
Number of Payments: 36 
Monthly Payment: 10000 
Amount Paid Back: 360000 
Interest Paid: 350000 
Program Over 

Press Enter to end --> 
Press any key to continue . . . 

Как вы можете видеть, сумма кредита явно неправильно. Как я могу исправить свой код?

+1

«Не давая правильного ответа» на самом деле не говорит нам, чего вы ожидаете от этого. Что вы получаете, и чего хотите? –

+0

Извините, я буду более ясен в будущем. –

+0

Просто отредактируйте вопрос и добавьте информацию. Не нужно жалеть, нужно только что-то исправлять! Бьюсь об заклад, если вы расскажете нам о реальной проблеме, люди, которые будут участвовать в голосовании, добавят голоса назад. –

ответ

0

Есть несколько проблем:

  1. Входите скорость в процентах, поэтому конвертировать их в десятичное число: MonthlyInt/100.0

  2. Ваше количество платежей должно быть либо фиксированной, либо вводится пользователем , Теперь он сначала считывается, но тогда в коде используется 36. Его следует заменить соответствующей переменной.

  3. Будьте осторожны с целым делением. На данный момент нет ошибки, но чтобы этого избежать, используйте 1.0 и 100.0 вместо 1 и 100, если вы хотите быть уверенными, что у вас есть плавающие.

  4. Убедитесь, что ваша математика правильная. На самом деле это должно быть самое первое, что вы делаете. Это сайт программирования, поэтому он не в тему.

  5. (необязательно) Обычно имена переменных не должны начинаться с заглавной буквы.

+0

Спасибо, я переключил формуляр MonthlyInt на MonthlyInt = (YearlyInt/100.0)/12; и я просто видел, что я жестко закодировал 36 в LOL, я это выдержу. Работает сейчас! –

+0

Я не думаю, что он выполняет целочисленное деление в любом месте своей программы. –

+0

@ andrew.punnett Я думал, что MonthlyInt был целым в первой ревизии, но это не было, да, нет ... Я отредактирую ответ. – sashkello

0

Предполагается, что программа рассчитана на сложные проценты или простой интерес?

Ваши расчеты неверны. Вы рассчитываете ежемесячную процентную ставку, которая делает ее похожей на простой интерес, но вы используете pow, что указывает на то, что делать с сложным процентом. Вероятно, вам следует изучить это.

0
#include<iostream> 
#include<cmath> 

using namespace std; 

int main() 
{ 

double YearlyInt, LoanAmount, Payment, AmountPaid, MonthlyInt, NumPayments; 




cout << "Enter the loan amount (LoanAmount) --> "; 
cin >> LoanAmount; 

cout << "Enter the YEARLY interest rate as a percentage --> "; 
cin >> YearlyInt; 

cout << "Enter number of payments --> "; 
cin >> NumPayments; 



cout << "Loan amount: " << LoanAmount << endl; 
cout << "Yearly Interest Rate: " << YearlyInt << "%" << endl; 
cout << "Number of Payments: " << NumPayments << endl; 

MonthlyInt = (YearlyInt/100.0)/12; 

Payment = MonthlyInt * pow ((1 + MonthlyInt), NumPayments)/(pow((1 + MonthlyInt), NumPayments) -1) * LoanAmount; 
cout << "Monthly Payment: " << Payment << endl; 

AmountPaid = Payment * 36; 
cout << "Amount Paid Back: " << AmountPaid << endl; 
cout << "Interest Paid: " << (AmountPaid - LoanAmount) << endl; 


cout << "Program Over" << endl << endl << endl << endl; 

cout << "Press Enter to end -->" << endl; 



return 0; 

Получили он просто переключился MonthlyInt = YearlyInt/12; к MonthlyInt = (YearlyInt/100.0)/12;

1

Вот программа, которая правильно вычисляет платежи предполагая следующее:

  • Годовой процент рассчитывается, как усугубляются ежемесячной выплатой процентов.
  • Ссуда ​​по кредиту не взимается.
  • Выплаты начинаются через месяц после предоставления кредита.
  • Размер ежемесячных платежей не изменяется.
  • Пропущено никаких ежемесячных платежей.

.

#include<iostream> 
#include<cmath> 

using namespace std; 

int main() 
{ 
    double YearlyInt, LoanAmount, Payment, AmountPaid, MonthlyInt; 

    int NumPayments; 

    cout << "Enter the loan amount (LoanAmount) --> "; 
    cin >> LoanAmount; 

    cout << "Enter the YEARLY interest rate as a percentage --> "; 
    cin >> YearlyInt; 

    cout << "Enter number of monthly payments --> "; 
    cin >> NumPayments; 

    cout << "Loan amount: " << LoanAmount << endl; 
    cout << "Yearly Interest Rate: " << YearlyInt << "%" << endl; 
    cout << "Number of Monthly Payments: " << NumPayments << endl; 

    MonthlyInt = pow(1 + YearlyInt/100, 1.0/12); 

    Payment = LoanAmount * pow(MonthlyInt, NumPayments) * 
          (MonthlyInt - 1)/
          (pow(MonthlyInt, NumPayments) - 1); 

    cout << "Monthly Payment: " << Payment << endl; 

    AmountPaid = Payment * NumPayments; 
    cout << "Amount Paid Back: " << AmountPaid << endl; 
    cout << "Interest Paid: " << (AmountPaid - LoanAmount) << endl; 

    cout << "Program Over" << endl << endl << endl << endl; 

    return 0; 
} 
1

Шаг 1: MonthlyInt не равно YearlyInt/12 из-за эффект компаундирования интереса. Общая формула для преобразования между скоростью меньшего периода и эквивалентной скоростью большего периода равна: (1 + r)^n = 1 + R. Таким образом, в этом случае r = MonthlyInt и R = YearlyInt. Поэтому первым делом необходимо изменить от:

MonthlyInt = YearlyInt/12; 

к:

MonthlyInt = pow ((1.0 + YearlyInt) , (1.0/NumPayments)) - 1.0; // note decimals! 

Шаг 2: Добавьте строку, которая печатает MonthlyInt, так что вы можете проверить расчет. :)

Шаг 3: Изменение AmountPaid = Payment * 36; в AmountPaid = Payment * NumPayments;

Шаг 4: Необязательно, добавьте знаки доллара и очистить десятичные.

Мы должны добавить заголовок #include<iomanip>, а затем установить число десятичных знаков с помощью cout << setprecision(n) << fixed << whateverVariable, где n равно числу десятичных знаков, которые вы хотите.

Revised код:

#include<iostream> 
#include<cmath> 
#include<iomanip> 

using namespace std; 

int main() 
{ 
    double YearlyInt = -1, LoanAmount = -1, Payment = -1, AmountPaid = -1, MonthlyInt = -1; 

    int NumPayments; 

    cout << "Enter the loan amount (LoanAmount) --> "; 
    cin >> LoanAmount; 

    cout << "Enter the YEARLY interest rate as a decimal number (e.g. 3.25% as .0325) --> "; 
    cin >> YearlyInt; 

    cout << "Enter number of payments --> "; 
    cin >> NumPayments; 

    cout << "Loan amount: $" << setprecision(2) << fixed << LoanAmount << endl; 
    cout << "Yearly Interest Rate: " << setprecision(3) << YearlyInt * 100 << "%" << endl; 
    cout << "Number of Payments: " << NumPayments << endl; 

    MonthlyInt = pow ((1.0 + YearlyInt) , (1.0/NumPayments)) - 1.0; 

    cout << "MonthlyInt: " << MonthlyInt*100 << "%" << endl; 

    Payment = MonthlyInt * pow ((1 + MonthlyInt), NumPayments)/(pow((1 + MonthlyInt), NumPayments) -1) * LoanAmount; 
    cout << "Monthly Payment: $" << setprecision(2) << Payment << endl; 

    AmountPaid = Payment * NumPayments; 
    cout << "Amount Paid Back: $" << AmountPaid << endl; 
    cout << "Interest Paid: $" << (AmountPaid - LoanAmount) << endl; 


    cout << "Program Over" << endl << endl << endl << endl; 

    cout << "Press Enter to end -->" << endl; 

    return 0; 
} 

Предположения: кредит имеет не-сборов годовых от YearlyInt быть усугублено ежемесячно, с ежемесячными платежами, с первым взносом, нанесенного на последний день того же месяца, в котором ссуда возникает и со всеми выплатами «вовремя» (независимо от того, что определяется как кредитор), применяемым, как если бы оно выплачивалось в последний день применимого периода.

0
#include<iostream> 
#include<cmath> 

using namespace std; 

int main() 
{ 

    double YearlyInt, LoanAmount, Payment, AmountPaid, MonthlyInt, NumPayments; 




    cout << "Enter the loan amount (LoanAmount) --> "; 
    cin >> LoanAmount; 

    cout << "Enter the YEARLY interest rate as a percentage --> "; 
    cin >> YearlyInt; 

    cout << "Enter number of payments --> "; 
    cin >> NumPayments; 



    cout << "Loan amount: " << LoanAmount << endl; 
    cout << "Yearly Interest Rate: " << YearlyInt << "%" << endl; 
    cout << "Number of Payments: " << NumPayments << endl; 

    MonthlyInt = (YearlyInt/100.0)/12; 

    Payment = MonthlyInt * pow ((1 + MonthlyInt), NumPayments)/(pow((1 + MonthlyInt), NumPayments) -1) * LoanAmount; 
    cout << "Monthly Payment: " << Payment << endl; 


    //correction to Amount paid Value 
    AmountPaid = Payment * NumPayments; 
    cout << "Amount Paid Back: " << AmountPaid << endl; 
    cout << "Interest Paid: " << (AmountPaid - LoanAmount) << endl; 


    cout << "Program Over" << endl << endl << endl << endl; 

    cout << "Press Enter to end -->" << endl; 



    return 0; 
} 
+0

Добро пожаловать в переполнение стека! Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! –

Смежные вопросы