public class AccuracyExample2 {
public static void main(String[] args) {
int apple = 1;
double pieceUnit = 0.1;
int number = 7;
double result = apple - number * pieceUnit;
System.out.println("사과 1개에서 남은 양 : " + result);
}
}
//출력 :
// 사과 1개에서 남은 양 : 0.29999999999999993
◎ 정수로 계산했을 때 정확한 값이 나타나는 예제
public class AccuracyExample {
public static void main(String[] args) {
int apple = 1;
int totalPiece = apple * 10;
int number = 7;
int result = totalPiece - number;
System.out.println("10조각에서 남은 조각 : " + result);
System.out.println("사과 1개에서 남은 양 : " + result / 10.0);
}
}
// 출력 :
// 10조각에서 남은 조각 : 3
// 사과 1개에서 남은 양 : 0.3
◎ 나눗셈 연산 후 NaN과 Infinity 처리(나눗셈 연산에서 예외 방지하기)
▷ 나눗셈(/) 또는 나머지(%) 연산에서 좌측 피연산자가 정수이고 우측 피연산자가 0일 경우 ArithmeticException 발생
▷ 좌측 피연산자가 실수이거나 우측 피연산자가 0.0 또는 0.0f이면 예외가 발생하지 않고 연산의 결과는 Infinity(무한대) 또는 NaN(Not a Number)이 됩니다.
5 / 0.0 → Infinity 5 % 0.0 → NaN
▷ Infinity 또는 NaN 상태에서 계속해서 연산을 수행하면 안됩니다.
▷ Double.isInfinite()와 Double.isNaN()을 사용해 / 와 % 연산의 결과가 Infinity 또는 NaN인지 먼저 확인하고 다음 연산을 수행하는 것이 좋습니다.
◎ 예외 방지 예시
public class InfinityAndNaNCheckExample {
public static void main(String[] args) {
int x = 5;
double y = 0.0;
double z = x / y;
// double z = x % y;
if(Double.isInfinite(z) || Double.isNaN(z)) {
System.out.println("값 산출 불가");
} else {
System.out.println(z + 2);
}
}
}
// 출력 :
// 값 산출 불가