我试图在此处构造一个if else
语句,并将其与从条件中获得的return
值和boolean
的结果混淆了。
在这种情况下,是否可能有两个语句return true
还是在第一个程序段之后退出?
有没有更好的方法来写这个? (也许使用switch
?)
此代码可用于支票账户提款。我希望它符合以下规则:
public boolean withdraw(double amount) {
//amount = amount of money asked to be withdrawn
if (amount > balance) {
setBalance(balance - amount - overdraftFee);
return true;
} else if (amount == 0) {
System.out.println("Withdrawal amount cannot be $0.00!");
return false;
} else if (amount < 0) {
System.out.println("Withdrawal amount cannot be a negative amount!");
return false;
} else {
setBalance(balance - amount);
return true;
}
}
答案 0 :(得分:3)
该方法将在第一次到达return
时停止。这样做的副作用是,如果else
块将在if
块中返回,则无需使用false
块(因为只有在条件{{1 }}。
更重要的是,double
不是用于Java中货币金额的好选择,它会在您的代码中引起舍入错误(我将在代码块后再解释)。更好的选择是BigDecimal
。
另一种写法是:
public boolean withdraw(BigDecimal amount) {
if (BigDecimal.ZERO.equals(amount)) {
System.out.println("Withdrawal amount cannot be $0.00!");
return false;
}
if (BigDecimal.ZERO.compareTo(amount) < 0) {
System.out.println("Withdrawal amount cannot be a negative amount!");
return false;
}
BigDecimal feeToCharge = (this.balance.compareTo(amount) < 0) ? this.overdraftFee : BigDecimal.ZERO;
setBalance(this.balance.minus(amount).minus(feeToCharge));
return true;
}
使用BigDecimal
代替double
作为货币的原因是,由于内部使用双精度表示形式,因此无法准确存储所有十进制数字。这会导致舍入错误,这对货币很重要。例如,以下测试失败:
@Test
public void testDoubleSubtraction() {
assertThat(0.3D - 0.1D, is(0.2D));
}
有错误
java.lang.AssertionError:
Expected: is <0.2>
but: was <0.19999999999999998>
答案 1 :(得分:2)
可能有多种方法可以更简洁地编写它,但我会这样做:
public boolean withdraw(double amount) {
if (amount <= 0.0) {
System.out.println("Withdrawal amount should be positive!");
return false;
}
double fee = (amount > balance) ? overdraftFee : 0.0;
setBalance(balance - amount - fee);
return true;
}
答案 2 :(得分:-5)
您可以使用Switch Case
switch (amount) {
case (0):
//your code here
break;
case (0>):
//your code here
break;
}