[CS] 뎃씨멀의 모든 것

사실 정확히는 부동소수점에 대한 이야기.

float는 기본적으로 오차를 가질 수 없는 구조로 되어있다.

일례로, 10진법에서 0.1을 이진법으로 표현할 경우에
0.00110011001100110011.......과 같이 무한소수로 표현될 수 밖에 없다

이유인 즉슨 기본적으로 이진법으로 구성되어있는 컴퓨터가 10진법을 표현하고자 해서 인데,
한정된 바이트를 확보하는 변수의 특성 상 특정 자릿 수까지 자르고 진행할 수 밖에 없는터.

실제로 엥간한 언어들에서 십진법 0.1을 변수에 넣고
다시 이를 출력해보았을 떄 먼가 이상야릇한 긴~ 소수를 보게 될 것이다.

https://0.30000000000000004.com/

 

Floating Point Math

Floating Point Math Your language isn’t broken, it’s doing floating point math. Computers can only natively store integers, so they need some way of representing decimal numbers. This representation is not perfectly accurate. This is why, more often th

0.30000000000000004.com

엥간한 언어 별로 소숫점을 다루는걸 보시려면 이 쪽으로 ㅎ

 

자 그렇다면 해결책은?

 

언어 자체적으로 이런 구조적인 문제를 해결하기 위해서
대부분 각자의 api를 제공하는 편이다

- python의 decimal 라이브러리가 대표적이고
- 또는 round() 함수로써 특정 자릿수에서 그냥 짤라 비교하거나
- 혹은 float의 자체 메소드인 as_integer_ratio()를 활용하거나
- 아니믄 math의 is_close() 메소드도 방안이 될 수 있다

그치만 이는 자체적인 후가공으로 그것처럼 보이는 것 뿐이지
컴퓨터 자체의 구조적인 한계를 뛰어넘기에는 다소 힘든 구석이 있지

 

자바도 그렇고, 향후에 구치적으로 이를 해결할 방법에 대해서
자세하게 후술 하기로 한다