如何测试double是否为零?

use*_*701 38 java

我有一些像这样的代码:

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) {

    }
}
Run Code Online (Sandbox Code Playgroud)

我基本上希望将来避免被零除的例外.

谢谢

Wil*_*son 47

未明确初始化时,类范围中的数字基元初始化为零.

必须显式初始化本地范围中的数字基元(方法中的变量).

如果你只是担心除零除外,那么检查你的双精度是不正确的,效果很好.

if(value != 0)
    //divide by value is safe when value is not exactly zero.
Run Code Online (Sandbox Code Playgroud)

否则,检查时,如果一个浮点值等double或float为0时,用于检测该值是否接近0的误差阈值,但不是很 0.

public boolean isZero(double value, double threshold){
    return value >= -threshold && value <= threshold;
}
Run Code Online (Sandbox Code Playgroud)

  • 应该如何定义错误阈值?这是非常主观的,可能不会做用户试图做的事情.如果阈值太大而你实际上将非零视为零怎么办? (4认同)
  • +1表示清楚只有类范围数字基元初始化为零. (3认同)

SLa*_*aks 8

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

但是,涉及浮点类型(计算double和float)可以是不精确的,所以它通常是更好地检查它是否接近到0:

if (Math.abs(foo.x) < 2 * Double.MIN_VALUE)
Run Code Online (Sandbox Code Playgroud)

您需要选择误差范围,这并不简单.


Pen*_*gen 7

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

  • 我通常发现将变量显式设置为其默认值而不是提高可读性会恰恰相反,实际上会降低可读性并使代码变得混乱。它是无关紧要的,不需要。 (3认同)