Java 在方法之间传递参数

Java passing parameters between methods

我在 Java 开始,并得到了一个简单的 ATM 编程练习。功能包括:

  1. 记住所有者 - 检查
  2. 开设账户并能够通过构造函数直接存入资金 - 检查
  3. 能取钱能存钱-支票
  4. 能够取消帐户,并让任何后续行动得到满足 抛出新的 IllegalStateException - 检查
  5. 帐户中可接受的最高金额为 100.000 美元,并告诉接线员他们是否试图超过限额,以及在达到限额之前可以存入多少 - 检查(某种程度上)

提示包括:人们希望以 100.00 的形式看到他们的钱,但这对 Java 的计算不利,因此请保持内部机器以美分(瑞士的 Rappen)和美元和任何外部消息运行美分(即双倍)。 除了从美分到美元和美分的转换之外,一切都运行良好。我决定在美分旁边使用一个并行双精度数,并调用一种方法将美分转换为美元和美分,而不会覆盖或更改 "internal" 计数。不幸的是,它似乎不想将参数成功传递给提到的方法,因此没有正确进行转换。

在构造函数中,我想让 kontostandInFranken(以美元和美分表示的账户余额)与 kontostand(以美分表示的账户余额)具有相同的权重,但我已经在那里碰壁了。例如,Dave 开了一个账户并立即存入 25.50 美元。当我 运行 在构造函数中进行计算时,50 美分将丢失,因为我必须先将 kontostandInFranken(以美元和美分表示的账户余额)转换为 int,然后才能将其乘以 100 并使其等于 kontostand(账户)余额(美分)

/**
 * @author (Daniel.l.einars@gmail.com) 
 * @version (1.0)
 * 
 * things that don't work:
 * PASSING PARAMETERS BETWEEN METHODS. WHAT AM I DOING WRONG?
 * CONVERTING BETWEEN RAPPEN AND FRANKEN & RAPPEN. ALWAYS ISSUES WITH DOUBLE VS. INTS
 */

public class Aufgabe2a
{
    private int kontostand;
    private double kontostandInFranken;
    private String kontoInhaber;
    private boolean kontoSaldiert;

    /**
     * Constructor
     */
    public Aufgabe2a(String kontoInhaber, double kontostandInFranken)
    {
        this.kontoInhaber = kontoInhaber;
        boolean kontoSaldiert = false;
        this.kontostand = kontostand;
/**
 *First issue. I can't seem to get the conversion from cents to dollars and  *cents right
*/        kontostand = (int)kontostandInFranken * (int)100;
    }

    /**
     * Ermöglicht Kontoeinzahlungen
     */
    public int geldEinzahlen(int geldEingezahlt){
        if(geldEingezahlt <=0){
            System.out.println("Sie können nur positive Beträge einzahlen. Bitte versuchen Sie es erneut.");
            return 0;
        }
        else if (kontoSaldiert == true){
            kontoCheck();
        }
        else frankenInRappen(geldEingezahlt); //calling converting method here

        if (kontostand + geldEingezahlt > 10000000){
            System.out.println("Sie überschreiten mit dieser Einzahlung die Maximalhöhe von CHF 100.000. Sie können nur CHF " + kontostandInFranken(kontostand) + 
            (100000 - kontostandInFranken) + "einzahlen.");
        }
        else kontostand = (kontostand + geldEingezahlt);
        return kontostand;
    }
    /**
     * Ermöglicht Geld abzuheben
     */
    public int geldAbheben(int geldAbgehoben){

        if(geldAbgehoben <=0){
            System.out.println("Sie können nur positive Beträge abheben. Bitte versuchen Sie es erneut.");
            return 0;
        }
        else if (kontoSaldiert == true){
            kontoCheck();
        }
        else  frankenInRappen(geldAbgehoben);

        if (kontostand - geldAbgehoben < 0){
            System.out.println("Sie möchten zuviel Geld abheben. Sie können nur" + kontostand + "abheben.");
        }
        else kontostand = (kontostand - geldAbgehoben);
        return kontostand;
    }

    /**
     * Rechnet Rappen in Franken um - calculats cents into dollars and cents      *ISSUE HERE
     */
    private double rappenInFranken(double betrag){
        double frankenBetrag = (betrag/100.0);
        return frankenBetrag;
    }
    /**
     * Rechnet Franken in Rappen um
     */
    private int frankenInRappen(int betrag){
        int rappenBetrag = (betrag*100);
        return rappenBetrag;
    }

    /**
     * Kontostand abfragen
     */
    public void kontostandAbfragen(){
        kontoCheck();
        rappenInFranken(kontostand);
        System.out.println("Kontoinhaber: " + kontoInhaber);
        System.out.println("Kontostand:  CHF " + kontostand +".-" );
        frankenInRappen(kontostand);
    }

    /**
     * Konto Saldieren/Auflösen
     */
    public void kontoSaldieren(boolean kontoSaldiert){
        kontoCheck();
        this.kontoSaldiert = kontoSaldiert;
        System.out.println("Sie haben Ihr Konto aufgelöst. Bitte nehmen Sie den restlichen Kontostand an sich");
        kontostand = kontostand - kontostand;
    }

    /**
     * Überprüft ob das Konto saldiert ist
     */
    private void kontoCheck(){
        if (kontoSaldiert == true){
            throw new IllegalStateException("Konto ist saldiert, keine weiteren Aktionen möglich.");
        } else return;
    }

    /**
     * Führt einen paralelen Kontostand in Franken
     */
    private double kontostandInFranken(int kontostand){
        kontostandInFranken = (kontostand / 100.0);
        return kontostandInFranken;
    }
}

您可能不应该将 "dollar" 和 "cents" 分别存储在两个 int 值中。只需将 "amount" 存储在 doubleBigDecimal 中,然后在显示时格式化该值。

示例使用 double:

double amount = 25.5;
System.out.println(amount); // Unformatted

System.out.printf("%.2f%n", amount);
System.out.println(new DecimalFormat("0.00").format(amount));
System.out.println(new DecimalFormat("#,##0.00").format(amount));
System.out.println(NumberFormat.getCurrencyInstance().format(amount));

amount = 100000;
System.out.printf("%.2f%n", amount);
System.out.println(new DecimalFormat("0.00").format(amount));
System.out.println(new DecimalFormat("#,##0.00").format(amount));
System.out.println(NumberFormat.getCurrencyInstance().format(amount));

输出:

25.5

25.50
25.50
25.50
.50

100000.00
100000.00
100,000.00
0,000.00

正如提示中所说,如果你只存储一些美分,会更容易。

例如

public class CheckingAccount
{
    private int _balance;
    private String _name;
    public CheckingAccount(String name, double initialBalance)
    {
        _name = name;
        _balance = (int)(initialBalance * 100);
    }
    ...
}