Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

맛있는 개발노트 (맛과 개발을 함께)

C# 세미나 자료: double과 decimal의 차이 본문

C# 학습/C# 언어의 기초

C# 세미나 자료: double과 decimal의 차이

DevGourmet 2025. 4. 8. 00:00

1. 개요

C#에서 실수형 데이터를 표현할 때 doubledecimal은 각각의 특성과 목적을 가진 데이터 타입입니다. 두 형식은 모두 소수점을 지원하지만, 정확도, 표현 방식, 사용 목적 등에서 큰 차이를 보입니다.

본 세미나에서는 double과 decimal의 차이를 수학적 정밀도, 연산 속도, 사용 사례 측면에서 비교하고, 언제 어떤 타입을 선택해야 하는지를 단계적으로 설명합니다.


2. 기본 이론

항목doubledecimal

비트 크기 64비트 128비트
정밀도 약 15~17자리 약 28~29자리
내부 표현 IEEE 754 부동소수점 (binary) 고정소수점 (BCD 기반)
속도 빠름 (하드웨어 지원) 상대적으로 느림
NaN/Infinity 지원 지원함 미지원 (예외 발생)
주요 사용처 과학, 공학, 3D 그래픽 금융, 회계, 통화 계산

2.1 double

  • 이진 기반 부동소수점 방식 (IEEE 754)
  • 상대 오차가 있지만 매우 빠름
  • 무한대, NaN 등 특별한 값 지원
double a = 1.0 / 3.0; // 0.333333...

2.2 decimal

  • 10진 기반 고정소수점 방식
  • 반올림 오류가 거의 없음
  • 속도는 느리지만 정확도 높음
decimal b = 1.0m / 3.0m; // 0.333333333333333333333...

3. 단계별 설명

3.1 초급: 정확도 비교 예시

double dResult = 0.1 + 0.2;
Console.WriteLine(dResult); // 0.30000000000000004

decimal mResult = 0.1m + 0.2m;
Console.WriteLine(mResult); // 0.3
  • double은 이진 표현의 한계로 정확한 0.3을 표현하지 못함
  • decimal은 정확한 결과를 반환함

3.2 중급: 금액 계산에서의 차이

double price = 10.00;
double tax = 0.075;
double total = price * (1 + tax);
Console.WriteLine(total); // 10.75(일 수 있으나 미세한 오차 발생 가능)

decimal dPrice = 10.00m;
decimal dTax = 0.075m;
decimal dTotal = dPrice * (1 + dTax);
Console.WriteLine(dTotal); // 정확한 10.75 출력

3.3 고급: 연산 속도 및 상황별 선택

Stopwatch sw = Stopwatch.StartNew();
double sumD = 0;
for (int i = 0; i < 1_000_000; i++) sumD += 0.1;
sw.Stop();
Console.WriteLine("double 연산 소요: " + sw.ElapsedMilliseconds + "ms");

sw.Restart();
decimal sumM = 0;
for (int i = 0; i < 1_000_000; i++) sumM += 0.1m;
sw.Stop();
Console.WriteLine("decimal 연산 소요: " + sw.ElapsedMilliseconds + "ms");
  • double은 속도가 빠르고, decimal은 느리지만 정밀도는 높음

4. 주의사항 및 팁

  • decimal은 정확하지만 모든 연산에 느림 → 대규모 계산에는 부적합
  • double은 속도 우선, decimal은 정확도 우선
  • double은 NaN, Infinity 등 특별한 상태를 표현할 수 있지만 decimal은 예외(Exception)를 발생시킴
  • float는 정밀도가 더 낮고, double보다도 더 간단한 계산용도에 적합함

5. 결론

  • **정확도가 필요한 계산(금융, 회계, 세금 등)**에는 decimal을 사용해야 하며,
  • 속도가 중요한 과학적 연산, 그래픽 처리, 측정값 계산에는 double을 권장합니다.
  • double의 부동소수점 한계를 이해하고, decimal의 성능 한계를 이해하는 것이 중요합니다.

6. Q&A

Q1. double과 decimal 중 기본 실수형은 무엇인가요?
A1. C#에서 리터럴 실수는 기본적으로 double로 해석됩니다. decimal을 사용하려면 접미사 m을 붙여야 합니다.

Q2. decimal이 항상 double보다 정확한가요?
A2. 소수점 계산에서는 그렇지만, decimal도 표현 가능한 자릿수(28~29자리)를 넘어서면 반올림이 발생합니다.

Q3. double의 NaN 값은 어떤 상황에서 발생하나요?
A3. 예: 0.0 / 0.0, sqrt(-1) 등 정의되지 않은 연산 결과

Q4. decimal에는 NaN이 없으면 문제가 되지 않나요?
A4. 대부분의 금융 계산에서는 NaN보다는 명시적인 예외 처리(Exception)가 더 적합하므로 문제가 되지 않습니다.