Mortgage Calculator Variable

Hey there!

I was doing the Mortgage Calculator as in the java courses with Mosh are explained. However, I didn’t quite get one part. Where’s the numberOfPaymentsMade variable specified? I’ve been trying to figure that out but I actually can’t. Any ideas to specify a value to that variable?

Edit: I just checked by debugging… the numerOfPaymentsMade actually gives the correct value. Now, I wanna know why is that? And just to be sure, does it have any issues or flaws?

package me.oriol;

import java.text.NumberFormat;
import java.util.Scanner;

public class Main {
final static byte MONTHS_IN_YEAR = 12;
final static byte PERCENT = 100;

public static void main(String[] args) {

    int principal = (int) readNumber("Principal", 1000, 1_000_000);
    float annualInterest = (float) readNumber("Annual Interest Rate", 0.1F, 30);
    byte years = (byte) readNumber("Period (Years)", 1, 30);

    printMortgage(principal, annualInterest, years);
    printPaymentSchedule(principal, annualInterest, years);
}

public static void printMortgage(int principal, float annualInterest, byte years) {
    double mortgage = calculateMortgage(principal, annualInterest, years);

    String mortgageCurrency = NumberFormat.getCurrencyInstance().format(mortgage);
    System.out.println("\nMORTGAGE" + "\n--------" + "\nMonthly Payments: " + mortgageCurrency + "\n");
}

public static void printPaymentSchedule(int principal, float annualInterest, byte years) {
    System.out.println("PAYMENT SCHEDULE" + "\n----------------");
    for (short month = 1; month <= years * MONTHS_IN_YEAR; month++) {
        double balance = calculateBalance(principal, annualInterest, years, month);
        System.out.println(NumberFormat.getCurrencyInstance().format(balance));
    }
}

public static double readNumber(String prompt, float min, int max) {
    Scanner scanner = new Scanner(System.in);
    float value;
    while (true) {
        System.out.print(prompt + ": ");
        value = scanner.nextFloat();
        if (value >= min && value <= max)
            break;
        System.out.println("Enter a number between " + (short) min + " and " + max + ".");
    }
    return value;
}

public static double calculateBalance(int principal, float annualInterest, byte years, short numberOfPaymentsMade) {
    float monthlyInterest = annualInterest / MONTHS_IN_YEAR / PERCENT;
    short numberOfPayments = (short)(years * MONTHS_IN_YEAR);

    return principal
            * (Math.pow(1 + monthlyInterest, numberOfPayments) - Math.pow(1 + monthlyInterest, numberOfPaymentsMade))
            / (Math.pow(1 + monthlyInterest, numberOfPayments) - 1);
}

public static double calculateMortgage (int principal, float annualInterest, byte years) {
    float monthlyInterest = annualInterest / MONTHS_IN_YEAR / PERCENT;
    short numberOfPayments = (short)(years * MONTHS_IN_YEAR);

    return principal
            * (monthlyInterest * Math.pow(1 + monthlyInterest, numberOfPayments)
            / (Math.pow(1 + monthlyInterest, numberOfPayments) - 1));
}

}

Assuming your code matches Mosh’s, it looks like he made it the fourth parameter of the calculateBalance method. Then he passes that parameter inside printPaymentSchedule while he loops through all of the months until the balance is paid off. Another option would have been to name that variable elapsedMonths or currentMonth something else like that to improve the clarity.

1 Like

Okay, but where does the code pass the numberOfPaymentsMade paramenter to the printPaymantSchedule method? By just adding there the calculateBalance method? And also, I still dont understand where u assign the numberOfPaymentsMade parameter… its assigned to 1, but how does it increase at the same time as the month variable?

Let’s take a look at this printPaymentSchedule method since it seems to be the crux of your issue.

First it prints a header message. Then iterate from 1 to years * 12 (as in, the number of months in total) where month is the iteration variable that is assigned to that value. Then call our calculateBalance method passing principal for the principal parameter, annualInterest for the annualInterest parameter, years for the years parameter, and month for the numberOfPaymentsMade parameter. Lastly, it prints out the formatted result from the call to calculateBalance.

The body of the loop is called once for every iteration (so once for every month). On the first iteration month is 1, on the second iteration month is 2, on the third iteration month is 3, etc.

Is that making sense? If not, are you having trouble understanding how method calls work or how loops work?

Made perfect sense! I just didnt understand a part coz i hadnt read it all, so my bad. Thank you

1 Like