3.5 나눗셈 연산 후 NaN과 Infinity 처리
나눗셈(/) 또는 나머지(%) 연산에서 좌측 피연산자가 정수이고 우측 피연산자가 0일 경우 예외 (ArithmeticException)가 발생한다. 무한대의 값을 정수로 표현할 수 없기 때문이다.
5 / 0 -> 예외 발생
5 % 0 -> 예외 발생
하지만 좌측 피연산자가 실수이거나 우측 피연산자가 0.0 또는 0.0f이면 예외가 발생하지 않고 연산의 결과는 Infinity(무한대) 또는 NaN(Not a Number)이 된다.
5 / 0.0 -> Infinity
5 % 0.0 -> NaN
Infinity 또는 NaN 상태에서 계속해서 연산을 수행하면 안 된다. 어떤 연산을 하더라도 결과는 계속해서 Infinity와 NaN이 되므로 데이터가 엉망이 될 수 있다.
Infinity + 2 -> Infinity
NaN + 2 -> NaN
그렇기 때문에 /와 % 연산의 결과가 Infinity 또는 NaN인지 먼저 확인하고 다음 연산을 수행하는 것이 좋다. 이를 확인하기 위해서는 Double.isInfinite()와 Double.isNaN()를 사용한다. 이렇게 하면 변수값이 Infinity 또는 NaN일 경우 true를, 그렇지 않다면 false를 산출한다.
boolean result = Double.isInfinite(변수);
boolean result = Double.isNaN(변수);
다음 예제에서 7라인과 8라인을 번갈아 주석 처리하며 실행해 보자.
[예제: InfinityAndNaNCheckExample.java]
package ch03.sec05;
public class InfinityAndNaNCheckExample {
public static void main(String[] args) {
int x = 5;
double y = 0.0;
double z = x / y;
//double z = x % y;
//잘못된 코드
System.out.println(z + 2);
//알맞은 코드
if(Double.isInfinite(z) || Double.isNaN(z)) {
System.out.println("값 산출 불가");
} else {
System.out.println(z + 2);
}
}
}
실행 결과
Infinity 또는 NaN
값 산출 불가
서브목차