290570
05.09 부동소수점 오류 본문
과제를 하다가 부동소수점 오류가 났다
import java.util.Scanner;
class D000{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
double x, result;
System.out.print("x 값을 입력 ==> ");
x = sc.nextDouble();
if (x<=0) {
result = x*x*x - 9*x +2;
}else{
result = 7*x +2;
}
System.out.print(result);
}
}
해당 코드에 0.2를 넣었는데 3.4가 아니라 3.4000000000000004 가 나왔다
검색해보니 아래와 같은 결과가 나왔다
1. System.out.printf("%.2f" , result); 와 같이 출력 소수점 범위 지정해주기
2. Math.round(숫자) 이용해서 반올림하기
3. *10 /10하기
4. Big Decimal
일단 printf를 이용하는 1번과 반올림하는 2번의 개념이 헷갈렸다.
둘의 큰 차이는 printf를 이용해서 소수점 범위를 지정하는건 출력 형식만 지정될 뿐 실제 값은 바뀌지 않는다.
하지만 Math.round()를 이용해서 반올림하게되면 실제 수치 값이 변경된다.
1번의 방법을 이용하기위해
System.out.print(result); 를 아래와 같이 바꿔줬다.
System.out.printf("%.1f",result);
소수점 첫번째 자리까지만 출력되게 지정.
가장 무난하게 쉽게 쓸수있는 방법 같지만 오류가 제대로 잡힌게 맞는지는 모르겠다.
2번은 아직 배운적 없는 메서드라 추가 검색을 해보았다.
Math.round() 외에도 Math.ceil() => 올림, Math.floor() => 내림 이 있다.
Math.round()를 이용해서 System.out.print(result); 를 아래와 같이 수정하면
System.out.print(Math.round(result));
3.4가 아니라 3이 나오게 된다.
Math.round() 를 그냥 넣으면 소수점 첫째자리에서 반올림이 되고 (ceil, floor를 이용해서 올림, 내림할때도 동일)
소수점 둘째자리에서 반올림 하려면
Math.round( 숫자 * 10 ) / 10.0
소수점 셋째 자리에서 반올림 하려면
Math.round( 숫자 * 100) / 100.0
소수점 넷째 자리에서 반올림 하려면
Math.round( 숫자 * 1000) / 1000.0
이렇게 해야한다고 한다.
System.out.print(Math.round(result*10)/10.0);
코드를 수정하게되면 이렇게 결과가 나온다.
앞서 말한대로 표기만 바뀌는게 아니라 실제 값을 바꿔버리기 때문에 중요한 상황에서 쓰기는 맞지 않은 방법 같다.
3번의 경우 10을 넣으면 아래와 같은데,
if (x<=0) {
result = (10*x*x*x - 10*9*x +10*2)/10;
}else{
result = (10*7*x + 10*2)/10;
}
결과도 3.4로 잘 나왔다.
하지만 0.2를 넣었을때 오류가 나지 않는것을 확인했을뿐 항상 오류가 없을거라는 보장을 할 수 없어서
간단한 계산을 할때만 사용할 수 있을 것 같다.
4번 Big Decimal
(추후 정리)
'java_spring (2024.05 ~ 2024.10)' 카테고리의 다른 글
24.05.15 (0) | 2024.05.15 |
---|---|
24.05.10 (0) | 2024.05.10 |
05.09 숫자 한글로 변환 (0) | 2024.05.09 |
05.09 프로그래밍 (0) | 2024.05.09 |
05.09 논리 연산자 (0) | 2024.05.09 |