Подтвердить что ты не робот

Как проверить, является ли double равным нулю?

У меня есть такой код:

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

    }
}

Я в основном хочу избежать исключения "разделить к нулю" в будущем.

Спасибо

4b9b3361

Ответ 1

Числовые примитивы в области класса инициализируются до нуля, когда они явно не инициализируются.

Числовые примитивы в локальной области (переменные в методах) должны быть явно инициализированы.

Если вас беспокоит только деление на нулевые исключения, проверка того, что ваш двойной не совсем точный, отлично работает.

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

В противном случае при проверке, является ли значение с плавающей запятой, например double или float равным 0, порог ошибки используется для определения того, находится ли значение около 0, но не довольно 0.

public boolean isZero(double value, double threshold){
    return value >= -threshold && value <= threshold;
}

Ответ 2

Да; все примитивные числовые типы по умолчанию равны 0.

Однако вычисления с использованием типов с плавающей запятой (double и float) могут быть неточными, поэтому обычно лучше проверить, приближается ли оно к 0:

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

Вам нужно выбрать допустимую погрешность, что не так просто.

Ответ 3

В Java 0 совпадает с 0.0 и удваивает значение по умолчанию 0 (хотя многие советуют всегда устанавливать их явно для улучшения удобочитаемости). Я проверил, и foo.x == 0 и foo.x == 0.0 являются истинными, если foo.x равно нулю

Ответ 4

Да, это действительный тест, хотя есть неявное преобразование из int в double. Для ясности/простоты вы должны использовать (foo.x == 0.0) для тестирования. Это будет препятствовать ошибкам NAN/делению на ноль, но двойное значение может в некоторых случаях быть очень очень близким к 0, но не точно равным нулю, а затем тест завершится неудачно (я говорю об этом вообще, а не о вашем коде). Подразделение будет давать огромные цифры.

Если это имеет какое-либо отношение к деньгам, не используйте float или double, а используйте BigDecimal.

Ответ 5

Самый безопасный способ будет побитовым, или ваш двойной с 0. Посмотрите на это XORing два удвоения в Java

В принципе, вы должны сделать if ((Double.doubleToRawLongBits(foo.x) | 0 ) ) (если это действительно 0)