2011-09-19 43 views
2

我正在嘗試制定一個程序,允許用戶在考慮貸款時確定不同的方面。第一個方程應該確定每月支付的貸款金額,利率和月數。第二個等式應該確定在給定貸款金額,利率和每月支付的情況下需要支付多少付款(或幾個月)。這是我正在測試的代碼,但我似乎無法獲得有效的輸出。如何在Java中執行貸款方程式?

float amount = 20000; 
    float rate = (float) 7.5; 
    float months = 60; 
    float payment = 450; 

    float answer = (float) (((amount*(rate/1200))*(1+(Math.pow((rate/1200), months))))/((1+Math.pow((rate/1200), months))-1)); 
    System.out.println(answer); 

    float answer2 = (log(payment/amount)-log((payment/amount)-(rate/1200)))/(log(1+(rate/1200))); 
    System.out.println(answer2); 

對於第一個方程式,我先一直得到錯誤,因爲它想要的答案是一張雙人牀和不停地告訴我,我的速度變量我無法從雙轉換浮動,所以我不得不把在演員中。一旦我得到了錯誤消失,我一直在獲得無限的答案。

對於第二個等式,它總是說我不能被零除。有沒有人知道任何解決方案。在網上查看時,似乎我正確地制定了我的方程式,所以我不知道如何使它們工作。

此外,如果任何人碰巧知道確定利率的好公式,那將非常有幫助。

+3

如果您不確定表達式的哪個部分導致問題,請逐位構建表達式,以便您可以在每個步驟檢查中間結果。 – NPE

+0

我的代碼現在讀爲: double amount = 20000; 雙倍率= 7.5; 雙月= 60; 雙倍付款= 450; ((rate(rate/1200))*(1+(Math.pow((rate/1200),months))))/((1 + Math.pow((rate/1200) 1200),幾個月)) - 1)); System.out.println(answer); (Math.log(payment/amount)-Math.log((payment/amount) - (rate/1200)))/(Math.log(1+(rate/1200)))); System.out.println(answer2); 而我的回答是無限的和52.23012630649508。 – Haley

回答

2

你不應該使用浮點/雙精度或原始整數的貨幣價值,使用的BigDecimal代替:http://download.oracle.com/javase/1.4.2/docs/api/java/math/BigDecimal.html

這使得不必做強制雙擊>浮動的演員和我希望的誤差消失。如果不是,請添加您的新代碼的評論。

+0

是的,堅持以BigDecimal爲基礎的任何浮點數學。這是獲得更準確答案的最佳方式。 –

+1

@Chris Aldrich:我認爲使用BigDecimal來處理所有floatint-point數學運算**的建議太泛泛而不能成爲好建議。 – NPE

+0

@aix - 也許你是對的。我想我剛剛遇到了足夠的情況,我意識到默認的浮點操作(特別是當你處理金錢時)對於原語並不是最好的。 BigDecimal是更準確的方法。但是,這也取決於您在討論時的精確度需求。儘管如此,我仍認爲這是一個有價值的一般性陳述 –

0

對於第二個等式:

float answer2 = (log(payment/amount)-log((payment/amount)-(rate/1200)))/(log(1+(rate/1200))); 

唯一可能的除以零是如果log(1+(rate/1200))等於0。 如果(rate/1200)返回0,這是可能的。你可以通過將(rate/1200)轉換爲浮點數來解決這個問題。

這樣:

float answer2 = (log(payment/amount)-log((payment/amount)-((float)(rate/1200))))/(log(1+((float)(rate/1200)))); 

我認爲錯誤在於這樣一個事實:rate/1200總是0因爲1200是一個整數,所以是分裂的解決方案。

3

你錯過了一些演員,而log應該是Math.log。當我將所有的都翻倍(你爲什麼使用花車這樣堅持使用雙打意味着你將不再需要把這些鑄件到處?)我得到以下的輸出:

無限
52.23012630649508

不知道第二個值應該是什麼,但似乎沒問題;沒有警告,也沒有錯誤。關於第一部分,你除以零。試試這個:

System.out.println(Math.pow(rate/1200, months)); 

,你會得到以下的小極少數

5。659799424266714E-133

浮點運算將導致你的分母爲零,因爲該值+1會失去精度,因此:

System.out.println(1+Math.pow(rate/1200, months)-1); 

息率0.0和你的分母將導致第二個結果是無窮。

+0

是的,我把所有東西都改成了兩倍,並得到了和你一樣的結果。你如何建議我去了解第一個方程,以便我沒有這個問題? – Haley

+0

@Haley,首先刪除'1 + Math.pow(...) - 1',就像我說的那樣,你失去了精度,並且在任何情況下,加1和減1的任何數都保持不變,所以沒用的。這至少會給你一個不是無限的答案。 – davin