2

我刚刚写了这个必须返回双精度值的简单方法。这是从银行帐户中提取资金的功能。该功能必须让用户只有在他输入的值小于他在他的帐户中的金额时才能拿到钱。有一个条件,如果他是特殊用户,即使尝试价值=余额+1000,他也可以拿钱。

由于我是 java 的初学者,我还不熟悉这种类型的东西(我是一名 php 程序员,所以我从来没有真正担心过这个问题,但是我很难让这段代码工作,因为我返回一个双精度,如果没问题,但返回一个错误,如果不是,我不能在 java 中这样做。这是我的方法。(变量“平衡”和“特殊”属于我的班级)。

public double getMoney (double value) {
    if (value <= balance) {
        balance = balance - value;
    } else {
        if (special == true && value < (balance+1000)) {
            return balance-value;
        } else {
            return false;
        }
    }
}

我知道这是一个菜鸟问题,但我刚开始学习 java 并且习惯于使用 PHP 进行编码,我不需要担心变量的类型,所以我想知道你是否可以给我一些建议。谢谢

4

3 回答 3

3

您可以返回 Double.NEGATIVE_INFINITY,而不是 false。然后调用者明确检查该值,并检测 ist 为无效 withDrawn()。

调用者通过

double val = getMoney(5000000);
if (val == Double.NEGATIVE_INFINITY) {
   // money could not be withdran
   // print message
} else {
   // ok money could be withdrawn
}

如果你想做得更专业,你必须重新调整一个事务信息:

TransActionInfo info = getMoney(500000);
if (info.getStatus == Status.LIMIT_EXCEEDED) {
   // could not withraw

} else {
   ...
}

而不是 if 你可以使用 switch 语句:

TransActionInfo info = getMoney(500000);
switch (info.getStatus()) {
  case: Status.OK: 
     break;
  case Status.LIMIT_EXCEEDED:
    // inform on display of bankomat. or similar
     break;
  ...
}
于 2012-11-28T19:17:03.310 回答
3

请注意,对于货币值,使用双精度通常是个坏主意。您当然不希望发生精度损失,对吗?

尝试研究十进制类型,例如 BigDecimal,或考虑使用存储在足够大整数类型中的分(如果您不需要支持分值的小数)。

不要回来false。要么返回0(“没有取款”),要么使用异常处理错误。即使在 PHP 或 JavaScript 等松散类型的语言中,这通常也是一个坏主意,因为它会导致意外行为。尽可能严格

另一位用户建议使用Double.NEGATIVE_INFINITY. 你也可以使用Double.NaN,但我强烈建议不要这样做。它会以一种非常微妙的方式使事情出错,这不是你想要的。你可能想要一个大胖例外。您确实希望该getMoney函数的用户处理这种情况,因此我建议使用实际上必须由调用getMoney.

于 2012-11-28T19:16:19.243 回答
2

我认为您应该将所有变量作为方法参数传递。因此,在方法范围内,您解决了您的问题并返回 true 或 false ...或不返回任何内容(void)。

public boolean hasMoney(double need, double balance, boolean special) {
    if( special ) {
        return balance+1000 >= need;
    } else {
        return balance >= need;
    }
}

如果返回是真的,你知道客户有足够的钱

于 2012-11-28T19:18:04.743 回答