포스트

C#의 자료형과 'decimal'

자료형과 크기

먼저, C++을 공부하고 오신 분이라면 자료형의 크기가 운영체제별로 달라질 수 있는지 궁금해하실 수 있습니다.
C#에서는 기본 자료형 크기가 운영체제에 상관없이 일관되게 정해져 있습니다.
이는 C#이 .NET 기반에서 JIT 컴파일 혹은 런타임 환경에서 동작하며, 이로 인해 자료형 크기가 표준화되어 있기 때문입니다.

C#의 JIT 컴파일에 대한 글 보러가기

다만, 기본 자료형 중에서도 플랫폼에 따라 크기가 달라지는 특수 자료형인 nintnuint가 존재합니다.
이들은 각각 32비트 시스템에서는 4바이트, 64비트 시스템에서는 8바이트로 변동되며, 플랫폼 간 이식성을 고려할 때 사용하는 자료형입니다.

bytesbyte

매우 짧은 자료형을 나타내는 byte의 경우 기본 자료형이 부호가 없는 “0~255”까지를 나타내는 자료형입니다.
부호가 있는 자료라는 뜻(signed)으로 앞에 s를 붙인 sbyte가 “-128 ~ 127”까지를 나타내는 자료형입니다.

 자료형크기범위
논리bool1 bytefalse / true
문자char2 byteU+0000 ~ U+FFFF (모든 UTF-16 문자)
정수형sbyte1 byte-128 ~ 127
 byte1 byte0 ~ 255
 short2 byte-32,768 ~ 32,767
 ushort2 byte0 ~ 65,535
 int4 byte-2,147,483,648 ~ 2,147,483,647
 uint4 byte0 ~ 4,294,967,295
 long8 byte-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
 ulong8 byte0 ~ 18,446,744,073,709,551,615
 nint4 byte / 8 byte(플랫폼에 따라 달라짐)
 nuint4 byte / 8 byte(플랫폼에 따라 달라짐)
실수형float4 byte$±1.5 × 10^{−45}$ ~ $±3.4×10^{38}$ (7자리 정밀도)
 double8 byte$±5.0×10^{−324}$ ~ $±1.7 × 10^{308}$ (15~16자리 정밀도)
 decimal16 byte$±1.0 × 10^{−28}$ ~ $±7.9228×10^{28}$ (28~29자리 정밀도)

float과 double, 그리고 decimal

실수를 표현하는 float, double, decimal은 자료형의 크기만 차이가 날 뿐 아니라, 정밀도와 표현할 수 있는 범위에도 차이가 존재합니다.

가장 큰 차이는 정밀도 입니다.

표에서 나타낸 바와 같이 float는 7자리, double은 15~16자리, decimal은 28~29자리의 정밀도를 제공합니다.

정밀도(precision)는 부동 소수점 숫자가 표현할 수 있는 유효 숫자의 개수 를 의미하며, 숫자가 얼마나 정확하게 저장되고 연산될 수 있는지를 나타냅니다.

따라서, decimal의 경우에는 금융 계산이나 통화 계산과 같이 매우 높은 정밀도가 요구되는 경우에 적합합니다.

decimal 자료형은 floatdouble에 비해 더 높은 정밀도를 제공하지만, 표현할 수 있는 값의 범위는 상대적으로 좁습니다.
또한, floatdouble은 하드웨어에서 직접 지원하는 IEEE 754 표준을 따르므로 부동 소수점 계산 속도가 상대적으로 빠릅니다.

즉, floatdoubledecimal보다 상대적으로 정밀도가 덜 필요하지만 빠르게 계산해야 하는 과학 시뮬레이션 등에서 사용하기 적합합니다.

정리

  • float, double
    • 정밀도: 각각 7자리, 15~16자리
    • 범위: decimal에 비해 매우 작은 숫자매우 큰 숫자를 모두 표현
    • 성능: decimal에 비해 빠름
    • 메모리: decimal에 비해 적은 메모리 필요
    • 용도: 과학적 계산과 같이 상대적으로 적은 정밀도가 필요하면서도 빠른 계산 처리가 필요한 경우에 사용
  • decimal
    • 정밀도: 28~29자리의 매우 높은 정밀도
    • 범위: floatdouble에 비해 좁음
    • 성능: floatdouble에 비해 상대적으로 느림
    • 메모리: floatdouble에 비해 많은 메모리 필요
    • 용도: 금융 프로그램과 같이 소수점 이하의 매우 높은 정밀도가 요구되는 경우에 사용

기본 자료형

C#에서 정수형 리터럴은 기본적으로 int, 실수형 리터럴은 double로 처리됩니다.

그 외에 특수한 접미사를 사용하는 경우는 다음과 같습니다.

자료형접미사
uint, nuintU
longL
ulongUL
floatF
decimalM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// int
int intVar = 123456;

// uint
uint uintVar = 123456U;

// long
long longVar = 123456789012345L;

// ulong
ulong ulongVar = 123456789012345UL;

// float
float floatVar = 1.0f / 3.0F;

// double
double doubleVar = 1.0 / 3.0;

// decimal
decimal decimalVar = 1.0M / 3.0M;

참고

C#의 JIT 컴파일이란?

char (C# reference) - MicrosoftLearn

Integral numeric types - MicrosoftLearn

Floating-point numeric types - MicrosoftLearn

이 기사는 저작권자의 CC BY-NC-ND 4.0 라이센스를 따릅니다.