본문 바로가기

Programming/프로그래밍 내용 정리

왜 프로그래밍 언어에서 0.1 + 0.2 는 0.3이 아닐까요?

 

🎈결론

 

인간은 숫자를 표현하기 위해 혹은 연산을 하기위해 10진법을 사용하지만
컴퓨터는 2진법을 사용하기 때문에

그 차이에서 비롯된 오차때문이다.

 

우리가 12라는 숫자를 컴퓨터에 입력하면
컴퓨터에서는 내부적으로 해당 숫자를 1100(이진법)으로 변환하여 처리한다.

 

우리가 소수 0.75를 입력하면
컴퓨터에서는 0.11(이진법)으로 변환하여 처리한다.

 

 

🎈 그럼 왜 2진수로 표현하는데 오차가 생길까?

 

0.1(십진법)을 이진법으로 변환하게 되면
0.0001100110011001100110011001....... 과 같이 무한 소수로 정확하게 떨어지지 않는다.

 

컴퓨터의 메모리는 무한하지 않기 때문에

표현할 수 있는 최대한의 범위 내에서

가장 근접한 값으로 반올림 처리하여 우리에게 결과를 보여준다.


그리고 이로 인해 위와 같은 오차가 발생하는 것이다.

 

 

🎈 이럴 때 BigDecimal 이 필요하다.

 

자료형 float double
크기 4byte 8byte
범위 -3.4*10^38 ~ 3.4*10^38 -1.7*10^308 ~ 1.7*10^308
유효자릿수 소수점 7번째 까지 유효 소수점 16번째까지 유효

 

- float, double은 부동소수점에 의해 2진수로 값을 변환하는데 이로 인해 정확한 값이 아닌 근사치를 표현해준다.

   이처럼 정밀도의 한계로 값이 유실되는 경우가 있는데 이를 방지할 때 BigDecimal을 사용한다. 

 

- float, double에 비해 BigDecimal은 더 많은 크기의 실수를 저장할 수 있으며 10진수로 값을 받기에 정확한 값을 보여준다.

 

- 돈 계산과 같이 정확한 값이 필요한 작업을 할 때 사용한다. 

 

- 하지만 float, double에 비해 속도가 느리다는 단점이 있다.

 

- BigDecimal은 문자열이기에 사칙연산이 안 된다. 이 때문에 클래스 내부 메서드를 사용한다.