본문 바로가기
기타 개념정리

프로그래밍 언어에서 0.1 + 0.2 = 0.3이 아닌 이유

by wakestand 2020. 2. 27.
반응형

Double 타입의 변수 a와 b에 0.1, 0.2를 넣고 더해봤더니

0.1 + 0.2인데 0.3이 나오는 것이 아니라

0.30000000000000004 가 나오는 것이 보인다

 

이게 뭐지? 버근가? 싶을텐데

 

컴퓨터는 모든 숫자를 0과 1로만(2진법) 표현할 수 있기 때문에

소수도 0과 1로 표현하는 과정에서 저렇게 오차가 나는 것이다

 

각종 프로그래밍 언어에서는 소수를 표현할 때

IEEE 754 부동 소수점 방식으로 소수를 표현하게 되는데

 

다른 방식인 고정 소수점 방식과 비교해 보자면

고정 소수점 방식은 소수를 정확하게 표현하지만

그 범위가 얼마 되지 않아

범위가 훨씬 넓은 IEEE 754 부동 소수점 방식을 사용하는데

 

부동 소수점 방식은 범위가 넓은 대신

값이 정확하게 떨어지지 않고

근사치만 제공해주게 된다

 

그래서 0.1 + 0.2를 해도 0.3이 아닌

0.3000~4가 떨어지게 되는 것이다

 

 

근데 값이 저렇게 나오는데 어떻게 소수를 사용하냐면

소수점을 보정해주는 BigDecimal을 사용해주면 된다

 

자바 소수 오차 없이 계산 및 사칙연산 방법

자바에서 소수점 계산 시 콘솔창 아래줄과 같이 값이 이상하게 나오는 경우가 있는데 IEEE 754 부동 소수점 방식으로 계산해서 저렇게 나오는 것이다 자세한 내용은 아래 글을 참조해주면 되고 프로그래밍 언어에..

wakestand.tistory.com

마지막으로 예제에 사용한 코드는 아래와 같다

 

import java.math.BigDecimal;

public class PlusExample {

	public static void main(String[] args) {
		Double a = 0.1;
		Double b = 0.2;
		
		// BigDecimal에 숫자 넣을때에는 문자로 넣을 것
		BigDecimal c = new BigDecimal(String.valueOf(a));
		BigDecimal d = new BigDecimal(String.valueOf(b));
		
		System.out.println("BigDecimalValue : " + c.add(d));
		System.out.println("Double Value : " + (a + b));
	}

}
반응형

댓글