부동 소수점 숫자 형식(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입니다. 각 부동 소수점 형식에는 해당 형식의 최소 및 최대 유한값을 제공하는 MinValueMaxValue 상수가 있습니다. 또한 floatdouble 형식은 숫자가 아닌 무한 값을 나타내는 상수를 제공합니다. 예를 들어 double 형식은 Double.NaN, Double.NegativeInfinityDouble.PositiveInfinity와 같은 상수를 제공합니다.

필요한 전체 자릿수를 소수점 이하 자릿수에 따라 결정하는 경우에는 decimal 형식이 적합합니다. 이러한 숫자는 일반적으로 재무 애플리케이션에서 통화 금액(예: $1.00), 이자율(예: 2.625%) 등에 사용됩니다. 소수점 한 자리 숫자인 경우에도 decimal 형식에서 더 정확하게 처리됩니다. 예를 들어 0.1은 decimal 인스턴스로 정확하게 표현될 수 있지만 0.1을 정확히 표현하는 double 또는 float 인스턴스는 없습니다. 10진 데이터에 double 또는 float를 사용하는 경우 숫자 형식의 차이로 인해 산술 계산에서 예기치 않은 반올림 오류가 발생할 수 있습니다. 성능 최적화가 정확성을 보장하는 것보다 중요한 경우 decimal 대신 double을 사용할 수 있습니다. 그러나 성능 차이는 계산 집약적인 애플리케이션을 제외한 모든 애플리케이션에서 알지 못합니다. decimal을 사용하지 않는 또 다른 가능한 이유는 스토리지 요구 사항을 최소화하는 것입니다. 예를 들어 ML.NETfloat를 사용합니다. 규모가 매우 큰 데이터 세트에서는 4바이트와 16바이트의 차이가 증폭되기 때문입니다. 자세한 내용은 System.Decimal를 참조하세요.

식에서 정수 형식과 floatdouble 형식을 혼합할 수 있습니다. 이 경우 정수 형식이 암시적으로 부동 소수점 형식 중 하나로 변환되며, 필요한 경우 float 형식이 암시적으로 double로 변환됩니다. 이 식은 다음과 같이 계산됩니다.

  • 식에 double 형식이 있는 경우 식은 관계형 및 같음 비교에서 double 또는 bool로 계산됩니다.
  • 식에 double 형식이 없는 경우 식은 관계형 및 같음 비교에서 float 또는 bool로 계산됩니다.

식에서 정수 형식과 decimal 형식을 혼합할 수도 있습니다. 이 경우 정수 형식은 암시적으로 decimal 형식으로 변환되고 식은 관계형 및 같음 비교에서 decimal 또는 bool로 계산됩니다.

식에서 decimal 형식을 floatdouble 형식과 혼합할 수 없습니다. 이 경우 산술, 비교 또는 같음 연산을 수행하려면 다음 예제와 같이 명시적으로 피연산자를 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# 언어 사양의 다음 섹션을 참조하세요.

참고 항목