이번에는 실수를 다뤄보도록 하자.
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
'C# > C# 기초 강의' 카테고리의 다른 글
C# 프로그래밍 강좌 5 - 변수와 자료형 2 (오버플로우) (0) | 2021.10.13 |
---|---|
C# 프로그래밍 강좌 4 - 변수와 자료형 1 (0) | 2021.08.02 |
C# 프로그래밍 강좌 3 - WriteLine, Write으로 출력하기 (0) | 2021.07.13 |
C# 프로그래밍 강좌 2 - Hello World! 코드 살펴보기 (0) | 2021.07.13 |
C# 프로그래밍 강좌 1 - 윈도우에서 개발환경 구성하기 (0) | 2021.07.12 |