Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- #csharp #문자열 #문자 #string #char #문자열보간 #문자열연결 #문자열비교 #형식지정자 #문자변환 #csharp세미나
- c#string
- c#
- #csharp #부동소수점 #반올림오차 #실수계산 #float #double #decimal #mathround #정확도비교 #csharp세미나
- #csharp #double #decimal #실수형 #정밀도 #부동소수점 #고정소수점 #금융계산 #과학계산 #csharp세미나 #닷넷기초
- 빗썸api
- 테더
- #csharp #연산자우선순위 #결합성 #operatorprecedence #연산자결합 #오른쪽결합 #왼쪽결합 #csharp세미나
- #csharp #스택과힙 #메모리구조 #값형식 #참조형식 #박싱 #가비지컬렉션 #힙메모리 #메서드스택 #csharp세미나
- #csharp #매개변수 #ref #out #params #명명된인수 #선택적매개변수 #메서드전달 #csharp세미나
- #csharp #수치형식 #numerictypes #리터럴 #형식추론 #접미사 #decimal #float #double #프로그래미링기조 #그래피포뷰
- #csharp #널연산자 #nulloperator #널조건부연산자 #널접합연산자 #nullcheck #csharp세미나 #nullsafe #코드안정성
- 파이썬
- #csharp #기본값 #definiteassignment #default키워드 #초기화규칙 #구조체초기화 #null값 #csharp세미나
- #csharp #산술오버플로우 #checked #unchecked #overflowexception #정수연산 #오버플로우처리 #csharp세미나 #디버깅 #성능최적화
- #csharp #배열 #다차원배열 #가변배열 #배열초기화 #indexrange #span #배열비교 #csharp기초 #배열세미나
- c#bool
- #csharp #관계연산자 #상등연산자 #equals #비교연산 #null비교 #float비교 #csharp기초 #csharp세미나 #문자열비교
- #csharp #수치변환 #형식변환 #자동변환 #명시변환 #convert #parse #tryparse #csharp세미나
- USDT
- #csharp #bool #boolean #논리연산자 #부울연산자 #단락평가 #조건문 #csharp기초 #삼항연산자 #csharp세미나
- #csharp #산술연산자 #arithmeticoperators #기초프로그래밍 #csharp기초 #연산자우선순위 #정수연산 #실수연산 #math클래스 #나눗셈예외 #csharp세미나 #닷넷개발 #프로그래밍입문
- #csharp #표현식 #배정표현식 #void표현식 #연산자 #산술연산자 #조건연산자 #표현식기초 #csharp세미나
- 무노동수입
- 자동매매
- #csharp #부동소수점 #nan #infinity #특수값 #ieee754 #수치계산 #double #float #decimal #csharp세미나
- #csharp #비트연산자 #bitwiseoperators #flagsenum #masking #시프트연산 #비트연산 #성능최적화 #csharp세미나 #하드웨어제어
- 빛썸
- #csharp #조건연산자 #삼항연산자 #논리연산자 #단락평가 #ifelse축약 #조건문 #프로그래밍기초 #csharp세미나
- #csharp #var키워드 #타입추론 #암묵적형식지정 #익명형식 #linq #지역변수 #csharp세미나
Archives
- Today
- Total
맛있는 개발노트 (맛과 개발을 함께)
C# 세미나 자료: double과 decimal의 차이 본문
1. 개요
C#에서 실수형 데이터를 표현할 때 double과 decimal은 각각의 특성과 목적을 가진 데이터 타입입니다. 두 형식은 모두 소수점을 지원하지만, 정확도, 표현 방식, 사용 목적 등에서 큰 차이를 보입니다.
본 세미나에서는 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)가 더 적합하므로 문제가 되지 않습니다.
'C# 학습 > C# 언어의 기초' 카테고리의 다른 글
C# 세미나 자료: 부울 형식과 연산자 (Boolean Type & Operators) (0) | 2025.04.08 |
---|---|
C# 세미나 자료: 실수 반올림 오차 (Floating-Point Rounding Error) (0) | 2025.04.08 |
C# 세미나 자료: 문자열과 문자 (String & Char) (0) | 2025.04.07 |
C# 세미나 자료: 특별한 부동소수점 값 (NaN, Infinity, -Infinity, -0) (0) | 2025.04.07 |
C# 세미나 자료: 비트별 연산자 (Bitwise Operators) (0) | 2025.04.07 |