我的代码中有一个问题,我的输入数据无法正确打印。该程序要求用户输入每个帐户的初始余额。但是,在打印该输入时,两个值始终会打印相同。无论我为第一个帐户输入什么内容,它始终会打印出与第二个帐户输入的值相同的值。该程序应打印出为每个帐户输入的单独值。

不仅如此,该程序在合成后不会为计算出的利息输出正确的值。我查看了代码,找不到任何错误。任何帮助将不胜感激。

输入数据:

Enter the customer’s full name: John
Enter the number of years: 4
Enter initial balance for the saving account: 10000.05
Enter initial balance for the check account: 20000.00

预期产量:
==========================================
Initial account balances
==========================================
John’s Account           Rate Balance
==========================================
Saving                   2.95% $10000.05
Check                    2.10% $20000.00
==========================================
==========================================
Final account balances after 4 years
==========================================
John’s Account          Rate   Balance
==========================================
Saving                  2.95%  $11250.87
Check.                  2.10%  $21750.98
==========================================

我的输出:
==========================================
Initial account balances
==========================================
John’s Account           Rate Balance
==========================================
Saving                   2.95% $20000.0
Check                    2.10% $20000.0
==========================================
==========================================
Final account balances after 4 years
==========================================
John’s Account          Rate   Balance
==========================================
Saving                  2.95%  $22501.623657381748
Check.                  2.10%  $24471.619413096105
==========================================

这是我的代码:

导入java.util.Scanner;
class Account{

private static double balance;

private static int NUM_COMPOUND_TIMES = 12;

Account(double Balance) { //constructor with parameter

    balance = Balance;
}

public double getInitialBalance(){ //get the initial balance method

    return balance;
}

public double getFinalBalance(double rate, int numYears) { //get the final balance method

    balance = getInitialBalance()*Math.pow((1+(rate/NUM_COMPOUND_TIMES)), (NUM_COMPOUND_TIMES*numYears));
    return balance;
}

}
class Customer{

private String customerName;
private static Account checkAccount;
private static Account savingAccount;


public Customer(String custName, Account savingAcc, Account checkAcc){ //constructor with parameters

    customerName = custName;

    savingAccount = savingAcc;

    checkAccount = checkAcc;

}

public Account getSavingAccount(){

    return savingAccount;
}

public Account getCheckAccount() {

    return checkAccount;
}

public String getCustomerName() {


    return customerName;
}

}
public class Bank {


private static Customer customerObj;
private static int numYears;
private static double INTEREST_SAVING;
private static double INTEREST_CHEQUE;


public static void main(String[] args) {

    createCustomerAccounts();

    printInitialBalances();

    printFinalBalances();

}


public static void createCustomerAccounts() {

    Scanner keyboard = new Scanner(System.in);
    System.out.println("Enter the customer's full name: ");
    String custName = keyboard.nextLine();
    System.out.println("Enter the number of years: ");
    numYears = keyboard.nextInt();
    System.out.println("Enter initial balance for the savings account: ");
    double ibSavings = keyboard.nextDouble();
    System.out.println("Enter initial balance for the cheque account: ");
    double ibCheck = keyboard.nextDouble();
    keyboard.close();

    Account savingAcc = new Account(ibSavings);
    Account checkAcc = new Account(ibCheck);
    customerObj = new Customer(custName, savingAcc, checkAcc);
}


public static void printInitialBalances() {

    System.out.println("==========================================");
    System.out.println("Initial account balances");
    System.out.println("==========================================");
    System.out.println(customerObj.getCustomerName() + "'s Account      Rate    Balance");
    System.out.println("==========================================");
    System.out.println("Saving          2.95%   " + "$" + customerObj.getSavingAccount().getInitialBalance());
    System.out.println("Check           2.10%   " + "$" + customerObj.getCheckAccount().getInitialBalance());
    System.out.println("==========================================");

}

public static void printFinalBalances() {

    INTEREST_SAVING = customerObj.getSavingAccount().getFinalBalance(0.0295,numYears);
    INTEREST_CHEQUE = customerObj.getCheckAccount().getFinalBalance(0.0210,numYears);

    System.out.println("==========================================");
    System.out.println("Final account balances after " + numYears + " years");
    System.out.println("==========================================");
    System.out.println(customerObj.getCustomerName() + "'s Account      Rate    Balance");
    System.out.println("==========================================");
    System.out.println("Saving          2.95%   " + "$" + INTEREST_SAVING);
    System.out.println("Check           2.10%   " + "$" + INTEREST_CHEQUE);
    System.out.println("==========================================");
}

}

最佳答案

您的错误是在Account类中。您已将余额定义为static变量,这意味着内存中仅共享balance值的单个引用:

private static double balance;

结果是任何时候随时更新任何账户的余额,余额的值将被覆盖。删除static关键字,以使余额在单个帐户实例本地:
private double balance;

另外,打印时balance的格式不是正确的货币格式,因为它正在使用默认格式打印出double值。一种简单的解决方法是使用NumberFormat的货币格式化程序。要使用它,请将此行添加到Bank类的顶部以导入NumberFormat:
import java.text.NumberFormat;

然后将货币格式作为变量添加到Bank类的顶部:
private static NumberFormat currency = NumberFormat.getCurrencyInstance();

现在,在您的打印余额方法中,您可以使用货币格式来获取String表示形式,作为正确的美元/美分格式,包括美元符号:
public static void printInitialBalances() {

    String myCurrency = currency.format(123.5);
    System.out.println("==========================================");
    System.out.println("Initial account balances");
    System.out.println("==========================================");
    System.out.println(customerObj.getCustomerName() + "'s Account      Rate    Balance");
    System.out.println("==========================================");
    System.out.println("Saving          2.95%   " + currency.format(customerObj.getSavingAccount().getInitialBalance()));
    System.out.println("Check           2.10%   " + currency.format(customerObj.getCheckAccount().getInitialBalance()));
    System.out.println("==========================================");

}


public static void printFinalBalances() {

    INTEREST_SAVING = customerObj.getSavingAccount().getFinalBalance(0.0295,numYears);
    INTEREST_CHEQUE = customerObj.getCheckAccount().getFinalBalance(0.0210,numYears);

    System.out.println("==========================================");
    System.out.println("Final account balances after " + numYears + " years");
    System.out.println("==========================================");
    System.out.println(customerObj.getCustomerName() + "'s Account      Rate    Balance");
    System.out.println("==========================================");
    System.out.println("Saving          2.95%   " + currency.format(INTEREST_SAVING));
    System.out.println("Check           2.10%   " + currency.format(INTEREST_CHEQUE));
    System.out.println("==========================================");
}

这会产生您希望的输出:
==========================================
Initial account balances
==========================================
John's Account      Rate    Balance
==========================================
Saving          2.95%   $10,000.05
Check           2.10%   $20,000.00
==========================================
==========================================
Final account balances after 4 years
==========================================
John's Account      Rate    Balance
==========================================
Saving          2.95%   $11,250.87
Check           2.10%   $21,750.98
==========================================

09-04 02:59
查看更多