Как проверить, является ли 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) {
}
}
Я в основном хочу избежать исключения "разделить к нулю" в будущем.
Спасибо
Ответы
Ответ 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)