부동 소수점 숫자 형식(C# 참조)
부동 소수점 숫자 형식은 실수를 나타냅니다. 모든 부동 소수점 숫자 형식은 값 형식입니다. 이것은 기본 형식이기도 하며, 리터럴로 초기화할 수 있습니다. 모든 부동 소수점 숫자 형식은 산술, 비교 및 같음 연산자를 지원합니다.
부동 소수점 형식의 특성
C#은 다음과 같은 미리 정의된 부동 소수점 형식을 지원합니다.
C# 형식/키워드 | 근사 범위 | 전체 자릿수 | Size | .NET 형식 |
---|---|---|---|---|
float |
±1.5 x 10−45 ~ ±3.4 x 1038 | ~6-9개 자릿수 | 4바이트 | System.Single |
double |
±5.0 × 10−324 ~ ±1.7 × 10308 | ~15-17개 자릿수 | 8바이트 | System.Double |
decimal |
±1.0 x 10-28 ~ ±7.9228 x 1028 | 28-29개의 자릿수 | 16바이트 | System.Decimal |
이전 표에서 맨 왼쪽 열의 각 C# 형식 키워드는 해당하는 .NET 형식의 별칭입니다. 서로 교환하여 사용할 수 있습니다. 예를 들어 다음 선언은 동일한 형식의 변수를 선언합니다.
double a = 12.3;
System.Double b = 12.3;
각 부동 소수점 형식의 기본값은 0
입니다. 각 부동 소수점 형식에는 해당 형식의 최소 및 최대 유한값을 제공하는 MinValue
및 MaxValue
상수가 있습니다. 또한 float
및 double
형식은 숫자가 아닌 무한 값을 나타내는 상수를 제공합니다. 예를 들어 double
형식은 Double.NaN, Double.NegativeInfinity 및 Double.PositiveInfinity와 같은 상수를 제공합니다.
필요한 전체 자릿수를 소수점 이하 자릿수에 따라 결정하는 경우에는 decimal
형식이 적합합니다. 이러한 숫자는 일반적으로 재무 애플리케이션에서 통화 금액(예: $1.00), 이자율(예: 2.625%) 등에 사용됩니다. 소수점 한 자리 숫자인 경우에도 decimal
형식에서 더 정확하게 처리됩니다. 예를 들어 0.1은 decimal
인스턴스로 정확하게 표현될 수 있지만 0.1을 정확히 표현하는 double
또는 float
인스턴스는 없습니다. 10진 데이터에 double
또는 float
를 사용하는 경우 숫자 형식의 차이로 인해 산술 계산에서 예기치 않은 반올림 오류가 발생할 수 있습니다. 성능 최적화가 정확성을 보장하는 것보다 중요한 경우 decimal
대신 double
을 사용할 수 있습니다. 그러나 성능 차이는 계산 집약적인 애플리케이션을 제외한 모든 애플리케이션에서 알지 못합니다. decimal
을 사용하지 않는 또 다른 가능한 이유는 스토리지 요구 사항을 최소화하는 것입니다. 예를 들어 ML.NET은 float
를 사용합니다. 규모가 매우 큰 데이터 세트에서는 4바이트와 16바이트의 차이가 증폭되기 때문입니다. 자세한 내용은 System.Decimal를 참조하세요.
식에서 정수 형식과 float
및 double
형식을 혼합할 수 있습니다. 이 경우 정수 형식이 암시적으로 부동 소수점 형식 중 하나로 변환되며, 필요한 경우 float
형식이 암시적으로 double
로 변환됩니다. 이 식은 다음과 같이 계산됩니다.
- 식에
double
형식이 있는 경우 식은 관계형 및 같음 비교에서double
또는bool
로 계산됩니다. - 식에
double
형식이 없는 경우 식은 관계형 및 같음 비교에서float
또는bool
로 계산됩니다.
식에서 정수 형식과 decimal
형식을 혼합할 수도 있습니다. 이 경우 정수 형식은 암시적으로 decimal
형식으로 변환되고 식은 관계형 및 같음 비교에서 decimal
또는 bool
로 계산됩니다.
식에서 decimal
형식을 float
및 double
형식과 혼합할 수 없습니다. 이 경우 산술, 비교 또는 같음 연산을 수행하려면 다음 예제와 같이 명시적으로 피연산자를 decimal
형식으로 변환하거나 반대로 변환해야 합니다.
double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);
표준 숫자 서식 문자열 또는 사용자 지정 숫자 서식 문자열을 사용하여 부동 소수점 값의 형식을 지정할 수 있습니다.
real 리터럴
real 리터럴의 형식은 접미사로 다음과 같이 결정됩니다.
- 접미사가 없거나
d
또는D
접미사가 있는 리터럴은double
형식입니다. f
또는F
접미사가 있는 리터럴은float
형식입니다.m
또는M
접미사가 있는 리터럴은decimal
형식입니다.
다음 코드에서는 각 예제를 보여 줍니다.
double d = 3D;
d = 4d;
d = 3.934_001;
float f = 3_000.5F;
f = 5.4f;
decimal myMoney = 3_000.5m;
myMoney = 400.75M;
앞의 예제에서는 _
를 숫자 구분 기호로 사용하는 예를 보여줍니다. 모든 종류의 숫자 리터럴에서 숫자 구분 기호를 사용할 수 있습니다.
또한 다음 예제와 같이 과학적 표기법을 사용하여 real 리터럴의 지수 부분을 지정할 수도 있습니다.
double d = 0.42e2;
Console.WriteLine(d); // output 42
float f = 134.45E-2f;
Console.WriteLine(f); // output: 1.3445
decimal m = 1.5E6m;
Console.WriteLine(m); // output: 1500000
변환
부동 소수점 숫자 형식 간의 암시적 변환은 float
에서 double
로의 암시적 변환 하나뿐입니다. 그러나 명시적 캐스트를 사용하여 부동 소수점 형식을 다른 부동 소수점 형식으로 변환할 수 있습니다. 자세한 내용은 기본 제공 숫자 변환을 참조하세요.
C# 언어 사양
자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.
참고 항목
.NET