알고리즘

부동 소수점 계산 시 정밀도 문제

근본넘치는개발자 2024. 9. 19. 21:30

 

0.1 + 1.2를 계산하면 얼마가 나와야 할까요?

수학을 배웠다면 1.3이라고 답했을 겁니다. 

 

하지만 실제로 컴퓨터를 통해 계산해 보면 아래와 같은 결과가 나옵니다.

 

1.3과 a+b의 값을 비교했을 때

우리가 생각한 것과 다르게 false가 나왔습니다.

 

왜 이런 문제가 발생할까요?

 

컴퓨터는 2진법을 통해 계산을 합니다.

이때 소수들의 경우 완벽하게 떨어지지 않는, 무한소수들이 존재하는데,

정해진 메모리 공간 아래 무한한 자리수들을 표기 할 수 없으므로

이를 처리하는 과정에서 오차가 발생하게 됩니다.

 

간단히 말하면 a에 정확하게 0.1이 저장된 게 아닌

0.1과 가까운 값이 저장된 상태라고 이해하시면 됩니다. 

 

그럼, 오차 없는 완벽한 계산은 못 하나요?  

다행이도 이를 위해 언어마다 라이브러리를 제공하고 있습니다.

  • Java : BigDecimal 모듈
  • JavaScript : big.js 등
  • 파이썬 : decimal 모듈

유니티 에서는

Mathf.Approxiamately() 함수를 사용하여 비교하면 더 정확하게 계산할 수 있습니다.

ex) Mathf.Aprroxiamately(a+b, 1.3) 

 

 

얼핏 봐서는 올바르게 동작할 것 같아 놓치기 쉬운 문제였습니다.

 

 

결론 :  되도록 정수를 사용하자.

 

 

참고하면 좋은 자료 

https://youtu.be/-GsrYvZoAdA?si=05RSy8lt4r0TnniF

 

https://youtu.be/ZQDsWySjY6g?si=QATdPTS5kOIrHOS7