2015-04-04 95 views
1

我需要計算一個人每年支付貸款的利息金額,並顯示每年貸款餘額的下降。我瞭解如何在紙上獲取數字,但我無法弄清楚如何爲其編寫代碼,而其他論壇根本沒有幫助。帶java的攤銷計劃

一個例子是什麼它應該看起來像爲:

Enter loan amount: 90000 
Enter loan duration in years: 15 
Enter interest rate as a percent: 6.75 


For a 15 year loan of $90000.00 at 6.75% interest 

Monthly payment = $ 796.42 
Total interest = $ 53355.33 

Yearly Balances 
Year Interest Loan Balance 
1  5965.23  86408.21 
2  5715.14  82566.33  
3  5447.64  78456.94  
4  5161.51  74061.43  
5  4855.46  69359.87  
6  4528.10  64330.94  
7  4177.95  58951.87  
8  3803.41  53198.26  
9  3402.80  47044.03  
10  2974.29  40461.31  
11  2515.95  33420.24  
12  2025.70  25888.91  
13  1501.31  17833.19  
14  940.40  9216.58  
15  340.45  -0.00 

我目前有:

import java.util.*; 
public class Loan 
{ 
    public static void main(String[] args) 
    { 
    Scanner keyboard = new Scanner(System.in); 
    int loanAmount, loanDurationYears, month; 
    double interestRate, monthlyPayment, totalInterest; 

    System.out.print("Enter loan amount:"); 
    loanAmount = keyboard.nextInt(); 

     System.out.print("Enter loan duration in years:"); 
    loanDurationYears = keyboard.nextInt(); 

     System.out.print("Enter interest rate as a percent:"); 
    interestRate = keyboard.nextDouble(); 
    keyboard.close(); 

    System.out.println("Loan amount: $" + loanAmount); 
    System.out.println("Loan duration: " + loanDurationYears + " years"); 
    System.out.println("Interest rate: " + interestRate + "%"); 

    monthlyPayment = payment(loanAmount, loanDurationYears, interestRate); 
    totalInterest = ((monthlyPayment * (loanDurationYears*12))-loanAmount); 
    printTotals(loanAmount, loanDurationYears, interestRate, monthlyPayment, totalInterest); 
    } 
    public static double payment(int loanAmount, int loanDurationYears, double interestRate) 
    { 
     int a = loanAmount; 
     int n = (loanDurationYears*12); 
     double i = ((interestRate*.01)/12); 
     double monthlyPayment = a*(Math.pow((1+i),n)*i)/((Math.pow((1+i),n))-1); 
     return monthlyPayment; 
    } 
    public static void printTotals(int loanAmount, int loanDurationYears, double interestRate, double monthlyPayment, double totalInterest) 
    { 
     System.out.println("For a " + loanDurationYears + " year loan of $" + loanAmount + " at " + interestRate + "% interest:"); 
     System.out.printf("Monthly payment = $"+ "%.2f", monthlyPayment); 
     System.out.println(); 
     System.out.printf("Total interest = $"+ "%.2f", totalInterest); 
     System.out.println(); 
    } 
} 
+6

當處理貨幣,雙打和浮動不使用雙精度或浮點數時,不會以完美的精度存儲小數點 – gia 2015-04-04 00:06:46

+0

@gia我在另一個論壇上讀到了這個消息,但是我的教授專門告訴我們使用雙打出於某種原因。 – 2015-04-04 00:58:57

+1

他可能希望你失敗,並通過經驗學習 – gia 2015-04-04 01:16:50

回答

0

和雙精度浮點數不應該用於貨幣,因爲小數部分不會一直精確。

但是,既然你必須使用雙打,我建議你將小數點向右移一點,直到你得到所有你需要的精度。

例如。 100.26將不會在任何時間儲存在雙倍數字上,但100260.00將會被儲存。這樣,您就不會丟失重要的十進制數字「.26」的精度,並在精確舍入的末尾添加精確的額外數字「0」(如果需要,否則停在「26」處)。

因爲100.26絕對不能存儲在雙精度上(否則您將失去小數精度),您將讀取用戶輸入爲字符串或BigDecimal類型,然後將該值乘以1000再乘以1000 。如果你使用一個字符串,你會發現點,刪除它,並將其放置在2/3點右側,然後轉換爲雙倍。

由於您將乘以1000,您的雙倍最大值將會受到更多限制,但是如果您不打算使用大數字,則可能不是問題。

您將使用x * 1000正常進行所有操作,並且在打印之前,您會將雙精度數據傳遞給您的某個精確數據類型,格式爲刪除* 1000並打印。

對於這種風格,你不需要特別的雙重,例如可以使用很長的時間,但是你去了,你會得到雙打的確切值。

+0

對不起,麻煩,但我仍然不知道如何去做。我今天有點慢。 – 2015-04-04 01:45:36

+0

我原本以爲你的問題沒有得到正確的十進制值,我的答案解決了這個問題,但你聲稱在那裏你實際上不知道如何做循環。這太基本了,對不起,你知道如何手動進行計算,所以只需將它寫在代碼中。研究循環,在那裏我廣泛地告訴你如何循環會去。 – gia 2015-04-04 01:49:15

+0

對不起,我現在正在循環工作,我只需要改變它,以便它顯示每年而不是每個月的數字。 – 2015-04-04 02:03:10