61

我有一些这样的代码:

class Foo {
    public double x;
}

void test() {
    Foo foo = new Foo();

    // Is this a valid way to test for zero? 'x' hasn't been set to anything yet.
    if (foo.x == 0) {

    }

    foo.x = 0.0;

    // Will the same test be valid?
    if (foo.x == 0) {

    }
}

我基本上想避免将来出现被零除的异常。

谢谢

4

5 回答 5

65

类范围内的数字原语在未显式初始化时初始化为零。

局部范围内的数字原语(方法中的变量)必须显式初始化。

如果您只担心除以零异常,那么检查您的双精度数是否不完全为零非常有用。

if(value != 0)
    //divide by value is safe when value is not exactly zero.

否则,当检查浮点值如doubleorfloat是否为 0 时,将使用错误阈值来检测该值是否接近 0,但不完全为 0。

public boolean isZero(double value, double threshold){
    return value >= -threshold && value <= threshold;
}
于 2013-08-15T19:31:00.510 回答
11

是的; 所有原始数字类型默认为0.

但是,涉及浮点类型 (doublefloat) 的计算可能不精确,因此通常最好检查它是否接近0

if (Math.abs(foo.x) < 2 * Double.MIN_VALUE)

您需要选择一个误差范围,这并不简单。

于 2013-08-15T19:29:57.963 回答
8

在 Java 中,0 与 0.0 相同,并且 double 默认为 0(尽管许多人建议始终明确设置它们以提高可读性)。如果为零,我已经检查过并且foo.x == 0foo.x == 0.0都是真的foo.x

于 2013-08-15T19:41:31.320 回答
3

是的,这是一个有效的测试,尽管有从 int 到 double 的隐式转换。为了清楚/简单起见,您应该使用 (foo.x == 0.0) 进行测试。这将阻碍 NAN 错误/除以零,但双精度值在某些情况下可能非常非常接近于 0,但不完全为零,然后测试将失败(我现在说的是一般性,而不是你的代码)。除以它会产生巨大的数字。

如果这与金钱有关,请不要使用 float 或 double,而是使用 BigDecimal。

于 2013-08-15T19:31:11.110 回答
-4

最安全的方法是用 0 对你的双精度进行按位或运算。看看这个在 Java 中对两个双精度进行异或运算

基本上你应该这样做if ((Double.doubleToRawLongBits(foo.x) | 0 ) )(如果它真的是0)

于 2013-08-15T19:32:47.340 回答