C#에서 float, double, decimal은 모두 값 형식(Value Type)에 해당하는 숫자 데이터 타입입니다. 세 가지 타입은 모두 실수를 다룰 수 있지만, 메모리 크기, 정밀도, 표현 범위에서 중요한 차이가 있어 용도에 맞게 선택하는 것이 매우 중요합니다.
C#의 값 형식(Value Type)이란?
값 형식 변수는 값을 직접 할당할 수 있는 타입으로, System.ValueType 클래스에서 파생됩니다. 참조 형식과 달리 값 형식은 데이터 자체를 스택(Stack) 메모리에 직접 저장하므로 접근 속도가 빠르고 관리가 단순합니다.
float — 32비트 단정밀도 부동 소수점
float는 32비트 단정밀도(single-precision) 부동 소수점 타입으로, 약 ±3.4 × 1038까지의 범위를 표현할 수 있습니다.
- 메모리 크기: 4바이트
- 유효 자릿수: 약 6~9자리
float a = 3.5f;
float 리터럴을 사용할 때는 반드시 숫자 뒤에 f 또는 F 접미사를 붙여야 합니다. 접미사를 생략하면 컴파일러는 해당 값을 double로 해석하기 때문에 컴파일 오류가 발생합니다.
double — 64비트 배정밀도 부동 소수점
double은 64비트 배정밀도(double-precision) 부동 소수점 타입으로, ±5.0 × 10-324부터 ±1.7 × 10308까지 매우 넓은 범위를 표현할 수 있습니다.
- 메모리 크기: 8바이트
- 유효 자릿수: 약 15~17자리
double d = 5.78788;
C#에서 실수 리터럴의 기본 타입이 double이기 때문에 별도의 접미사 없이 사용할 수 있습니다. 과학 계산, 그래픽 처리 등 일반적인 실수 연산에는 double이 가장 널리 사용됩니다.
decimal — 128비트 고정밀 십진수
decimal은 128비트 정밀한 십진수 타입으로, 28~29자리의 유효 숫자를 지원하며 범위는 ±7.9 × 1028입니다.
- 메모리 크기: 16바이트
- 유효 자릿수: 28~29자리
decimal d = 1.0M;
decimal 리터럴에는 M 또는 m 접미사를 붙여야 합니다. decimal은 이진 기반인 float와 double과 달리 십진수 기반으로 동작하므로 0.1 같은 값을 오차 없이 정확하게 표현할 수 있습니다. 따라서 금융 계산, 회계 처리 등 정확성이 필수적인 분야에서 반드시 사용해야 합니다.
세 가지 타입 비교 요약
| 구분 | float | double | decimal |
|---|---|---|---|
| 메모리 크기 | 4바이트 | 8바이트 | 16바이트 |
| 비트 수 | 32비트 | 64비트 | 128비트 |
| 유효 자릿수 | 약 6~9자리 | 약 15~17자리 | 28~29자리 |
| 접미사 | f / F | 없음(기본값) | m / M |
| 주요 용도 | 메모리 절약이 필요한 경우 | 일반적인 실수 연산 | 금융·회계 등 정확한 계산 |
어떤 타입을 선택해야 할까?
일반적인 수학 연산이라면 성능과 범위 면에서 유리한 double을 권장합니다. 메모리 제약이 큰 환경(대량의 배열 처리 등)에서는 float가 적합하고, 돈과 관련된 계산처럼 작은 오차도 허용되지 않는 경우에는 반드시 decimal을 사용해야 합니다.