В Java, когда число с плавающей запятой равно нулю?

Для каких значений x проверка (x == 0) возвращает истину? Есть ли какой-то запас или тест возвращает true тогда и только тогда, когда значение x = 0?


person Wilco    schedule 16.10.2013    source источник
comment
Вы задали вопрос и одновременно ответили   -  person newuser    schedule 16.10.2013
comment
@newuser В этом нет ничего плохого, см. stackoverflow.com/help/self-answer.   -  person Duncan Jones    schedule 16.10.2013


Ответы (3)


Когда Math.signum(x) == 0.

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

Но Math.signum() настолько прост, что он никогда не должен давать сбоев.

person JonAar Livernois    schedule 11.04.2015

Можно написать простой метод для нахождения этого значения.

public class FloatEqualsZero {
    public static void main(String [] args) {
        float x = 1;
        while(x != 0 && -x != 0) {
            x *= 0.1;
            System.out.println(x);
        }
    }
}

Это выводит следующее:

0.1
0.01
9.999999E-4
9.999999E-5
9.999999E-6
9.999999E-7
...
1.0E-37
1.0E-38
1.0E-39
1.0E-40
1.0E-41
1.0E-42
1.0E-43
9.8E-45
1.4E-45
0.0

Этот (и подобные тесты) показывают, что (x == 0) действительно верно только тогда, когда x равен 0,0f или -0,0f.

person Wilco    schedule 16.10.2013

Когда он равен 0.0 или -0.0.

public void test() {
  double x = 0.0;
  double y = -0.0;
  double z = 0.0;
  test(x, y);
  test(y, z);
  test(x, z);
  test(x, (int)y);
  test(y, (int)z);
  test(x, (int)z);

}

private void test(double x, double y) {
  System.out.println("x=" + x + " y=" + y + " \"x == y\" is " + (x == y ? "true" : "false"));
}

private void test(double x, int y) {
  System.out.println("x=" + x + " y=" + y + " \"x == y\" is " + (x == y ? "true" : "false"));
}

отпечатки

x=0.0 y=-0.0 "x == y" is true
x=-0.0 y=0.0 "x == y" is true
x=0.0 y=0.0 "x == y" is true
x=0.0 y=0 "x == y" is true
x=-0.0 y=0 "x == y" is true
x=0.0 y=0 "x == y" is true
person OldCurmudgeon    schedule 16.10.2013