사실 정확히는 부동소수점에 대한 이야기.
float는 기본적으로 오차를 가질 수 없는 구조로 되어있다.
일례로, 10진법에서 0.1을 이진법으로 표현할 경우에
0.00110011001100110011.......과 같이 무한소수로 표현될 수 밖에 없다
이유인 즉슨 기본적으로 이진법으로 구성되어있는 컴퓨터가 10진법을 표현하고자 해서 인데,
한정된 바이트를 확보하는 변수의 특성 상 특정 자릿 수까지 자르고 진행할 수 밖에 없는터.
실제로 엥간한 언어들에서 십진법 0.1을 변수에 넣고
다시 이를 출력해보았을 떄 먼가 이상야릇한 긴~ 소수를 보게 될 것이다.
https://0.30000000000000004.com/
엥간한 언어 별로 소숫점을 다루는걸 보시려면 이 쪽으로 ㅎ
자 그렇다면 해결책은?
언어 자체적으로 이런 구조적인 문제를 해결하기 위해서
대부분 각자의 api를 제공하는 편이다
- python의 decimal 라이브러리가 대표적이고
- 또는 round() 함수로써 특정 자릿수에서 그냥 짤라 비교하거나
- 혹은 float의 자체 메소드인 as_integer_ratio()를 활용하거나
- 아니믄 math의 is_close() 메소드도 방안이 될 수 있다
그치만 이는 자체적인 후가공으로 그것처럼 보이는 것 뿐이지
컴퓨터 자체의 구조적인 한계를 뛰어넘기에는 다소 힘든 구석이 있지
자바도 그렇고, 향후에 구치적으로 이를 해결할 방법에 대해서
자세하게 후술 하기로 한다
'코딩을 허자' 카테고리의 다른 글
[Mac] Powerline 세팅하기 (0) | 2021.12.31 |
---|---|
[IoT] 삼성 SDS (SHN-8912) 월패드 성공기 2-2 : 인피니티워 2 (2) | 2021.12.26 |
[CS] 카피의 모든 것 (0) | 2021.12.24 |
[IoT] 삼성 SDS (SHN-8912) 월패드 성공기 2-1 : 인피니티워 (1) | 2020.09.20 |
[IoT] 삼성 SDS (SHN-8912) 월패드 성공기 1 (4) | 2020.05.03 |