2014-02-06 158 views
-1

我一直在为我的C++类开发一个简单的贷款计算器程序,但我不能为我的生活找出我要出错的地方。除计算贷款的总利息外,整个计划按预期运作。我觉得这里的答案很简单,但我看不到它。计算贷款计算器程序总利息的问题(C++)

#include <iostream> 
#include <iomanip> 
#include <cmath> 
using namespace std; 

int main() 
{ 
    int numberOfPayments; 
     double monthlyInterestRate; 
     double Loan; 
     double monthlyPayment; 
     double annualInterestRate; 
     double interestTotal; 
     double loanTotal; 


    cout << "Enter the loan amount (principal) --> "; 
    cin >> Loan; 
    cout << "Enter the YEARLY interest rate as a percentage --> "; 
    cin >> annualInterestRate; 
    cout << "Enter the number of payments --> "; 
    cin >> numberOfPayments; 

    monthlyInterestRate = annualInterestRate/12; 
    monthlyInterestRate = monthlyInterestRate/100; 
    monthlyPayment = (monthlyInterestRate) * pow((1 + monthlyInterestRate), numberOfPayments)/(pow((1 + monthlyInterestRate), numberOfPayments) - 1) * Loan; // Amount of monthly payments 
    loanTotal = (monthlyPayment * numberOfPayments); // Total amount due for loan 
    interestTotal = monthlyInterestRate * numberOfPayments * monthlyPayment; 


    cout << monthlyInterestRate << endl; 
    cout << "Loan Amount:         $" << setw(8) << Loan << endl; 
    cout << "Yearly Interest Rate:       " << setw(8) << annualInterestRate << "%" << endl;   
    cout << "Number of Payments:        " << setw(8) << numberOfPayments << endl; 
    cout << "Monthly Payment:        $" << setw(8) << setprecision(5) << monthlyPayment << endl; 
    cout << "Amount Paid Back:        $" << setw(8) << setprecision(7) << loanTotal << endl; 
    cout << "Interest Paid:         $" << setw(8) << setprecision(5) << interestTotal << endl; 
    cout << "\n\nProgram Over"; 
    cout << "\n\n\nPress Enter to end -->"; 
    cin.ignore(); 
    cin.get(); 
    return 0; 
} 
+0

首先错误在那里:'monthlyInterestRate = annualInterestRate/12;'你复合?什么类型的“年度”利益呢? – 2014-02-06 21:40:44

+0

我不确定我了解你的问题。如果有帮助,它应该使用简单的兴趣。 – user3281514

+0

什么是印刷,你期望它打印什么?至少每月付款的计算对我来说很合适。 – TypeIA

回答

0

这是一个数学和编程问题。

的利息计算是错误的,通过@ m24p指出,应提高 为

interestTotal = (numberOfPayments * monthlyPayment) - Loan; // (@dvnrrs) 

但程序应遵循财务计算到每一分钱。 (或任何货币单位)。每月付款的初始计算需要四舍五入。每月的利息,付款和余额都需要四舍五入。那么最终结果通常与完整的double数学不同。理想情况下,这将在货币最低单位完成,以避免重复* 100和/ 100。

凭借10万美元的6%和360美元的月付款,总收益达到了0.26美元。
最后一次付款,361月,为0.45美元。

monthlyPayment = round(monthlyPayment * 100)/100; 
    double RealInterestTotal = 0.0; 
    unsigned Month = 0; 
    while (Loan > 0.0){ 
    Month++; 
    double InterstThisMonth = round(Loan*monthlyInterestRate*100)/100; 
    RealInterestTotal = R(RealInterestTotal + InterstThisMonth); 
    double PaymentOnLoan = R(monthlyPayment - InterstThisMonth); 
    if (PaymentOnLoan > Loan) { 
     PaymentOnLoan = Loan; 
    } 
    Loan = R(Loan - PaymentOnLoan); 
    } 
    cout << "Real Interest Paid:        $" << setw(8) 
      << setprecision(8) << RealInterestTotal << endl; 
    cout << "Months:           " << setw(8) 
      << setprecision(8) << Month << endl; 

为了解决由@Zac霍兰德,使用上述round()没有清楚地示出了2个条件,其中我建议四舍五入应该发生凸起好点:
1)的计算有分数分如monthlyPaymentInterstThisMonth
2)由于代表美元而不是美分的double的典型二进制64属性,舍入被使用。重新写信使用函数R(),如果以美分计算,这将是无操作的。

为了好玩,看到Vancouver Stock Exchange

+0

我可以从个人经验告诉你,金融机构不会将中间结果转换为2位数字。大多数人至少需要4位数字,只能围绕最终结果。因此,保持双打直到输出结果良好,并鼓励避免舍入错误。 –

+0

@Zac Howland有趣 - 我个人的经历有所不同。问题往往是什么是一个中间结果?每月付款通常是一个合同金额,因此不能有一个分数的价值。每月累计的利息直接影响每月余额。这些我都不会称之为中间结果,因为在那个时候可以偿还贷款。无论如何,我建议我们同意财务计划有涉及四舍五入的内部和法律要求。程序员需要意识到它们存在并相应编码。 – chux

+0

我同意最后一点。但只是为了分享我的经验(无论是从银行角度还是从加油站会计的角度) - 中间价值就是任何不是最终的金额。因此,每月支付金额是一个中间值 - 在发票上打印时,它将四舍五入到最接近的一分钱,但在计算中使用时,将以高精度(通常为4位小数)进行存储。汽油也是如此:您以每加仑X.YZ99的价格(在美国)购买天然气。这是为了防止处理部分加仑时的舍入误差。 –

0
interestTotal = monthlyInterestRate * numberOfPayments * monthlyPayment; 

这是不正确的。总利息不需要乘以每月付款。你需要一个不同的计算。

这不是一个真正的C++问题,是吗?

+0

当我删除该部分的计算,它仍然没有给我一个正确的输出。 – user3281514

+0

谢谢,dvnrrs。 @ user3281514 - 当然,你仍然需要做正确的计算。如果您有任何具体问题需要帮助,请告知我们。 – m24p

+0

我想这不是一个C++问题,因为此外我需要的是如何正确计算总体兴趣。我为我的天真而道歉。 – user3281514

1
interestTotal = monthlyInterestRate * numberOfPayments * monthlyPayment; 

这应该是

interestTotal = (numberOfPayments * monthlyPayment) - Loan; 

numberOfPayments * monthlyPayment为您提供实际上支付的总金额。你只需要减去你借来的金额(Loan)来找出哪部分是利息。