Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

290570

05.09 부동소수점 오류 본문

java_spring (2024.05 ~ 2024.10)

05.09 부동소수점 오류

qordpsem 2024. 5. 9. 20:08

과제를 하다가 부동소수점 오류가 났다

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