ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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에 대해 자세히 알아보기

    https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/floating-point-numeric-types

     

    부동 소수점 숫자 형식 - C# 참조

    기본 제공 C# 부동 소수점 형식인 float, double 및 decimal에 대해 알아보기

    learn.microsoft.com

     

    반응형

    댓글

Designed by Tistory.