Java 在方法之间传递参数
Java passing parameters between methods
我在 Java 开始,并得到了一个简单的 ATM 编程练习。功能包括:
- 记住所有者 - 检查
- 开设账户并能够通过构造函数直接存入资金 - 检查
- 能取钱能存钱-支票
- 能够取消帐户,并让任何后续行动得到满足
抛出新的 IllegalStateException - 检查
- 帐户中可接受的最高金额为 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" 存储在 double
或 BigDecimal
中,然后在显示时格式化该值。
示例使用 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);
}
...
}
我在 Java 开始,并得到了一个简单的 ATM 编程练习。功能包括:
- 记住所有者 - 检查
- 开设账户并能够通过构造函数直接存入资金 - 检查
- 能取钱能存钱-支票
- 能够取消帐户,并让任何后续行动得到满足 抛出新的 IllegalStateException - 检查
- 帐户中可接受的最高金额为 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" 存储在 double
或 BigDecimal
中,然后在显示时格式化该值。
示例使用 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);
}
...
}