본문 바로가기

C#/C# 기초 강의

C# 프로그래밍 강좌 6 - 변수와 자료형 3 (실수)

728x90
728x90

이번에는 실수를 다뤄보도록 하자.

float, double, decimal

C#에서는 기본적으로 위 3개의 자료형으로 사용하여 실수를 다루게 된다.

float

먼저 float를 보자. float는 이전 글에서 4바이트만큼 할당되는 자료형임을 알 수 있다. float 변수를 초기화하기 위해선 다음과 같이 써야 한다.

using System;

namespace TrainCsharp
{
    class Program
    {
        static void Main(string[] args)
        {
            float a = 1.0f;
            Console.WriteLine(a);
        }
    }
}

바로 소수점 값을 대입할 때 f를 붙여 이 값이 float 자료형임을 알려줘야 한다.

 

소수점이 붙은 값은 기본적으로 double 자료형으로 인식되는데 8바이트의 크기를 가지고 있는 double의 값을 float 변수에 넣을 수 없기 때문에 f를 붙이는 것이다.

 

이에 더해 같은 4바이트인 int 값을 넣는 것은 f를 붙이지 않아도 가능하다.

float a = 1; // Able!

double

다음으로 double은 쉽다. 앞서 말했듯이 코드에서 입력되는 실수는 double로 인식되므로 따로 어떤 문자를 붙이지 않아도 된다.

double b = 1.23456;

decimal

decimal 변수를 초기화할 때는 M을 붙여 decimal 값임을 알려야 한다.

decimal c = 1.22M;

부동소수점 오차

다음과 같이 작성하고 컴파일, 실행해보자.

using System;

namespace TrainCsharp
{
    class Program
    {
        static void Main(string[] args)
        {
            double a, b;
            a = 0.333;
            b = 0.666;
            Console.WriteLine("결과: " + (a + b));
        }
    }
}

 

기대한 결과는 0.999가 나와야 할 것이다. 하지만

결과: 0.9990000000000001

 

생각지도 않은 1이 붙은 걸 알 수 있다. 왜 이렇게 된 걸까? 이는 컴퓨터의 구조상 실수를 완벽하게 표현할 수 없음에서 나온다. 그래서 옛날 옛적 엔지니어들과 학자들이 고안한 방법은 부동소수점과 고정소수점이 있다.

 

여기서 float와 double이 부동소수점 방식을 사용하는데 부동소수점은 실수를 완벽하게 계산할 수 없어 여기에 오차가 발생하게 된다.

 

decimal에서 쓰는 고정소수점 방식의 경우 부동소수점보다 정확하지만 4강에서도 봤듯이 double에 비해 2배나 많은 메모리를 차지한다.

 

그래서 프로그래밍을 할 때는 되도록 실수를 사용해야 할 상황을 만들지 않고 실수를 사용하더라도 오차가 생겨도 별로 상관없을 때 사용한다.

 

부동소수점과 고정소수점에 대해서는 다음 글에서 자세히 알아볼 수 있다.

 

https://codetorial.net/articles/floating_point.html

 

숫자를 부동소수점 방식으로 표현하기 - Codetorial

부호, 지수, 가수 IEEE 754 부동소수점 표현에서 숫자는 아래와 같이 부호부, 지수부, 가수부의 세 부분으로 구성됩니다. 각 부분의 역할과 사용하는 비트 수는 아래와 같습니다. 부호부 (Sign) : 1비

codetorial.net

 

728x90
728x90