실수 타입(double, float)으로 연산할 때, 0으로 나누거나 나머지를 구하면 에러가 발생하는 대신 특별한 상수값을 반환한다.
나누는 수(제수)가 0.0일 때 발생
5 / 0.0 → Infinity (양의 무한대)-5 / 0.0 → -Infinity (음의 무한대)연산 결과를 숫자로 정의할 수 없을 때 발생
5 % 0.0 → NaN (나머지를 정의할 수 없음)0.0 / 0.0 → NaN (부정형)한 번 Infinity나 NaN이 발생하면, 그 이후의 모든 연산 결과가 망가지기 때문
double x = 5 / 0.0; // Infinity
double y = x + 100; // Infinity
double z = x * 0; // NaN (무한대에 0을 곱하면 숫자가 아님)
더 큰 문제는 비교 연산자를 쓸 때다. 특히 NaN은 어떤 숫자와 비교해도, 심지어 자기 자신과 비교해도 false를 반환한다.
double myNan = Double.NaN;
System.out.println(myNan == Double.NaN); // 결과: false (주의!)
연산 결과가 Infinity나 NaN인지 확인하려면 반드시 전용 메소드를 사용하자.
| 상황 | 확인 메소드 | 사용 예시 |
|---|---|---|
| 무한대인가? | Double.isInfinite(value) |
if(Double.isInfinite(z)) { ... } |
| 숫자가 아닌가? | Double.isNaN(value) |
if(Double.isNaN(z)) { ... } |
double input = 0.0; // 사용자 입력값
double result = 5 / input;
if (Double.isInfinite(result) || Double.isNaN(result)) {
System.out.println("값 산출 불가");
} else {
System.out.println("결과: " + (result + 10));
}
ArithmeticException 대신 Infinity나 NaN이 발생한다.NaN은 == 연산자로 체크할 수 없으며, 반드시 Double.isNaN()을 써야 한다.