Для каких значений x проверка (x == 0) возвращает истину? Есть ли какой-то запас или тест возвращает true тогда и только тогда, когда значение x = 0?
В Java, когда число с плавающей запятой равно нулю?
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