-
C# 계산오류? 부동 소수점에 대해 알아보자닷넷/C# 2023. 3. 2. 15:57반응형
최근에 닷넷 오픈모임방에서 질문이 하나 올라왔다.
[????] [오후 5:53] C#에서 100-63.1 하면 36.9라는 결과가 나오는데
[????] [오후 5:53] 100-64.1을 하면 35.900000000000006 라는 결과가 출력됩니다
[????] [오후 5:53] 이유가 뭔지 알 수 있을까요?
[????] [오후 5:53] 사진[????] [오후 5:54] 제 PC가 이상한걸까요.. 아님 원래 그런걸까요..
이렇게 나오는 원인은 근사치로 계산 되는 부동 소수점 때문이다.
100-64.1부터 근사치가 되는 이유는?
64.1은 십진수에서는 정확한 수이지만, 이진수에서는 정확하게 표현할 수 없는 수이다. 따라서 부동 소수점으로 표현할 때 근사치가 된다.
즉, 64.1을 이진수로 변환하면 1000000.0001100110011001100110011001100110011001100110011010...과 같이 무한 소수가 된다. 이진수에서는 유한한 비트 수로 표현하므로, 64.1을 정확히 표현할 수 없다. 따라서 100-64.1은 35.900000000000006과 같이 부동 소수점에 근사치로 계산된다.
부동 소수점
부동 소수점은 소수점 이하의 값을 가지는 실수를 컴퓨터에서 표현하는 방법 중 하나이다. 컴퓨터에서는 이진수로 실수를 표현하기 때문에, 부동 소수점은 이진 소수점으로 표현된다.
부동 소수점은 실수형 변수에 저장되며, 소수점 이하의 값을 가질 수 있다. 예를 들어, 3.14와 같은 실수는 부동 소수점으로 표현된다.
그러나 컴퓨터에서는 부동 소수점을 정확하게 표현하는 것이 불가능하다. 부동 소수점 연산에서는 정확도 문제가 발생할 수 있으며, 이러한 문제는 부동 소수점이 어떻게 표현되는지와 관련이 있다. 부동 소수점은 이진수로 표현되기 때문에, 소수점 이하의 값이 무한히 반복될 수 있다. 따라서 일부 실수값은 정확하게 표현할 수 없고, 근사치로 표현된다.
C#에서 부동 소수점
C#에서 부동 소수점은 실수형 데이터 타입인 float와 double로 표현된다. float는 32비트, double은 64비트의 메모리를 사용하여 실수를 표현한다.
C#에서 부동 소수점 연산을 수행할 때는 위에 부동 소수점에 대해 설명한 바와 같이, 부동 소수점은 이진수로 표현되기 때문에 소수점 이하의 값이 무한히 반복될 수 있는, 예를 들어, 0.1과 같은 십진수는 이진수로 정확하게 표현할 수 없으며, 근사치로 표현하는 것과 같이 부동 소수점 정확도 문제에 대해 주의해야 한다.
부동 소수점 정확도 문제를 최소화하기 위해서는 적절한 자리수에서 반올림하는 등의 방법을 사용하거나, 정수형으로 변환해 문제를 해결할 수 있다. 또한, C#에서는 Decimal이라는 부동 소수점 정확도 문제를 해결하기 위한 128비트 실수형 데이터 타입도 제공된다.
같이보면 좋을 내용
C# 부동 소수점 형식인 float, double, decimal에 대해 자세히 알아보기
반응형'닷넷 > C#' 카테고리의 다른 글
C# JSON 파일 읽기/쓰기 (Deserialize/Serialize) (0) 2023.04.04 C# XML 파일 읽기/쓰기 (0) 2023.03.28 C# URL 파라미터 인코딩 방법 (특수문자가 있는 경우에 사용) (0) 2022.10.19 Convert a string to an enum in C# (0) 2022.05.10 c# 부팅시 자동 시작하는 프로그램, 레지스트리에 등록 또는 삭제 방법 (0) 2021.11.30