Следующий оператор бросает java.lang.ArithmeticException: / by zero
как очевидный.
System.out.println(0/0);
потому что литерал 0
считается литералом int
и деление на ноль не допускается в целочисленной арифметике.
Следующий случай, однако не выполняет исключение, например java.lang.ArithmeticException: / by zero
.
int a = 0;
double b = 6.199;
System.out.println((b/a));
Отображается Infinity
.
Следующий оператор создает NaN
(Not a Number) без исключения.
System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic.
В этом случае оба операнда считаются двойными.
Аналогично, следующие операторы не делают исключение.
double div1 = 0D/0; //or 0D/0D
double div2 = 0/0D; //or 0D/0D
System.out.printf("div1 = %s : div2 = %s%n", div1, div2);
System.out.printf("div1 == div2 : %b%n", div1 == div2);
System.out.printf("div1 == div1 : %b%n", div1 == div1);
System.out.printf("div2 == div2 : %b%n", div2 == div2);
System.out.printf("Double.NaN == Double.NaN : %b%n", Double.NaN == Double.NaN);
System.out.printf("Float.NaN == Float.NaN : %b%n", Float.NaN == Float.NaN);
Они производят следующий вывод.
div1 = NaN : div2 = NaN
div1 == div2 : false
div1 == div1 : false
div2 == div2 : false
Double.NaN == Double.NaN : false
Float.NaN == Float.NaN : false
Все они возвращаются false.
Почему эта операция (деление на ноль) разрешена с номерами с плавающей запятой или двойной точностью?
Кстати, я могу понять, что числа с плавающей запятой (числа двойной точности) имеют свои значения, которые представляют собой положительную бесконечность, отрицательную бесконечность, а не число (NaN
)...