C#에서 통화(금액)를 다룰 때 가장 적합한 데이터 형식은 바로 decimal입니다. decimal은 128비트 크기의 데이터 형식으로, 금융 및 화폐 계산에 특화되어 설계되었습니다. 약 1.0 × 10⁻²⁸부터 약 7.9 × 10²⁸까지의 값을 유효 숫자 28~29자리로 표현할 수 있으며, decimal 변수를 초기화할 때는 숫자 뒤에 접미사 m 또는 M을 붙여야 합니다.
decimal b = 2.1m;
아래 예제는 decimal 형식이 가질 수 있는 최솟값과 최댓값을 확인하는 코드입니다.
예제
using System;
namespace DemoApplication{
public class Program{
public static void Main(){
Console.WriteLine($"Decimal Min Value: {decimal.MinValue}");
Console.WriteLine($"Decimal Max Value: {decimal.MaxValue}");
Console.ReadLine();
}
}
}실행 결과
Decimal Min Value: -79228162514264337593543950335 Decimal Max Value: 79228162514264337593543950335
decimal 형식의 값 집합은 (-1)^s × c × 10⁻ᵉ 형태로 표현됩니다. 여기서 부호 s는 0 또는 1이고, 계수 c는 0 ≤ c < 2⁹⁶을 만족하며, 스케일 e는 0 ≤ e ≤ 28의 범위를 가집니다. 참고로 decimal 형식은 부호 있는 0(signed zero), 무한대(infinity), NaN을 지원하지 않으며, 내부적으로는 10의 거듭제곱으로 스케일링된 96비트 정수로 저장됩니다.
절댓값이 1.0m 미만인 decimal 값은 소수점 28번째 자리까지 정확하게 표현되고, 절댓값이 1.0m 이상인 경우에는 28~29자리까지 정확도를 보장합니다. float나 double과 달리 decimal은 0.1 같은 십진 소수를 오차 없이 정확하게 나타낼 수 있다는 것이 가장 큰 장점입니다. float와 double에서는 이런 숫자들이 이진법으로 표현할 수 없는 무한 소수가 되어 반올림 오류(round-off error)가 발생하기 쉽습니다.
결론적으로 decimal은 float나 double보다 정밀도가 높고, 그 대신 표현 범위는 더 좁기 때문에 돈과 관련된 계산에서는 decimal 사용이 권장됩니다.
활용 예제: 달러를 루피로 변환하기
미국 달러(USD)를 인도 루피(INR)로 변환하는 간단한 예제를 통해 decimal의 실제 활용법을 살펴보겠습니다.
using System;
namespace DemoApplication{
public class Program{
public static void Main(){
decimal usd = 2.5m;
Console.WriteLine($"USD: {usd}");
decimal inrOfOneUSD = 75.04m;
Console.WriteLine($"INR value of one USD: {inrOfOneUSD}");
decimal inr = usd * inrOfOneUSD;
Console.WriteLine($"INR value: {inr}");
Console.ReadLine();
}
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
USD: 2.5 INR value of one USD: 75.04 INR value: 187.600