2012-01-12 25 views
1

まずこれはクラスの割り当てですので、私は助けていただければ幸いです。私は、私のコードに見られるように、金利などに基づいて毎月の支払いを計算する必要がありますが、何かが私の計算とは異なります。私の出力はnot a numberと思われるnanと表示されています。私はどこに間違いがあるのか​​、この問題を解決する方法についての提案はどこにあるのか把握しようとしていますか?前もって感謝します。計算出力=ナノ?

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

int main() 
{ 
    //collect payment info 
    double loanAmount = 0; 
    double anualRate = 0; 
    double monthlyIntRate = 0; 
    int numOfPayment = 0; 
    double monthlyPayment = 0; 
    double amountPaidBack = 0; 
    double interestPaid = 0; 

    cout << "Enter loan amount: "; 
    cin >> loanAmount; 
    cout << "Enter Anual Interest Rate: "; 
    cin >> anualRate; 
    cout << "Enter Payments made: "; 
    cin >> numOfPayment; 

    //calculate montly payment 
    monthlyPayment = (loanAmount * pow(monthlyIntRate + 1, numOfPayment) * monthlyIntRate)/(pow(monthlyIntRate + 1, numOfPayment) - 1);              

    //calculate amount paid back 
    amountPaidBack = monthlyPayment * numOfPayment; 

    //calculate interest paid 
    monthlyIntRate = anualRate/12; 
    interestPaid = monthlyIntRate * numOfPayment; 

    //split input from calculated output 
    cout << "-----------------------------\n" << endl; 

    //Display the calulated data 
    cout << fixed; 
    cout << setprecision(2); 

    cout << "Loan Amount: " << setw(15) << "$ "<< right << loanAmount << endl; 

    cout << "Monthly Interest Rate: " << setw(14) << monthlyIntRate << "%" << endl; 

    cout << "Number of Payments: " << setw(17) << numOfPayment << endl; 

    cout << "Montly Payment: " << setw(19) << "$ " << monthlyPayment << endl; 

    cout << "Amount Paid Back: " << setw(17) << "$ " << amountPaidBack << endl; 

    cout << "Interest Paid: " << setw(18) << "$ " << interestPaid << endl; 

    return 0; 

出力:

Loan Amount:    $ 100000.00 
Monthly Interest Rate:   1.00% 
Number of Payments:    36 
Montly Payment:     $ nan 
Amount Paid Back:    $ nan 
Interest Paid:     $ 36.00 
+4

デバッガの使い方を知っていますか?どの計算がnansを生成しているかを調べるには、コードをステップ実行する必要があります。 –

+1

デバッガを使用してコードをステップ実行し、各ステップで変数の値を調べようとしましたか? – suszterpatt

+2

ナノは実際には数字ではありません。毎月の支払いのために計算のさまざまな部分をプリントアウト( 'cout')して、計算がどこに行くのかを調べるのはなぜでしょうか。 –

答えて

6

あなたがゼロ除算しています。 (0 + 1)^numOfPaymentにそうpow(monthlyIntRate + 1, numOfPayment) eqauls、monthlyIntRateに格納されている

monthlyPayment = (loanAmount * pow(monthlyIntRate + 1, numOfPayment) * monthlyIntRate)/(pow(monthlyIntRate + 1, numOfPayment) - 1); 

値はゼロであり、したがって、1である、pow(monthlyIntRate + 1, numOfPayment) - 1)は、様々な力が非常に大きい数字につながっている0

+0

なぜ、このdownvote、これは正しいです。 monthlyPaymentに割り当てられている式の除数は0と評価され、結果はnanになります。 – Doug

+2

'monthlyIntRate'は' monthlyPayment'の後に計算されています。 'monthlyPayment'の計算時に、' monthlyIntRate'は0です。 – Divya

+0

彼は実際にゼロをゼロで割っています。ゼロで割った(ゼロでない)数は無限になります。 – quinmars

0

である:それは、この行で発生します。 Iだろう単にalgerbraを使用して、式:

monthlyPayment = (loanAmount * pow(monthlyIntRate + 1, numOfPayment) * monthlyIntRate)/(pow(monthlyIntRate + 1, numOfPayment) - 1);              
0

あなたはこの割り当てを行います。あなたは毎月の支払いの計算にそれを使用monthlyIntRate = anualRate/12後。したがって、使用される毎月の金利は0.0で、ゼロで除算するとNaNの出力が得られます。あなたがそれを前に移動するならば、それはすべて動作します。

関数の先頭にあるすべての変数を宣言するスタイルは、非常にCエスクで、C++では好まれません。 を常に宣言し、変数をできるだけ使用のポイントに近づけて初期化すると、これらの種類のエラーがはるかに簡単になります。同じポイントで変数を宣言して初期化することができるときはいつでも、それが本当の価値を得る前に間違って使用する可能性のある場所は1つ少なくなります。

5

前述の@FlopCoderと同様に、monthlyPaymentが計算されると、monthlyIntRate == 0となります。 だから、分数

monthlyPayment = (loanAmount * pow(monthlyIntRate + 1, numOfPayment) * monthlyIntRate)/(pow(monthlyIntRate + 1, numOfPayment) - 1); 

除数0です。

nanを取得するには不十分です。 配当0でない場合、infとなります。あなたの場合でもです。次に、nanが得られます。

関連する問題