부동 소수점 숫자 형식은 실수를 나타냅니다.
모든 부동 소수점 숫자 형식은 값 형식입니다.
이것은 기본 형식이기도 하며, 리터럴로 초기화 할 수 있습니다.
모든 부동 소수점 숫자 형식은 산술, 비교, 같음 연산자를 지원합니다.

 

부동 소수점 형식의 특성

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 형식은 Doble.NaN, Double.NegativeInfinity 및 Double.PositiveInfinity와 같은 상수를 제공합니다.
필요한 전체 자릿수를 소수점 이하 자릿수에 따라 결정하는 경우에는 decimal 형식이 적합합니다.
소수점 한 자리 숫자인 경우에도 decimal 형식에서 더 정확하게 처리됩니다.
예를 들어 0.1은 decimal 인스턴스로 정확하게 표현될 수 있지만 0.1을 정확히 표현하는 double 또는 float 인스턴슨느 없습니다.
10진 데이터에 double또는 flaot을 사용하는 경우 숫자 형식의 차이로 인해 산술 계산에서 예기치 않은 반올림  오류가 발생할 수 있습니다.
성능 최적화가 정확성을 보장하는 것보다 중요한 경우 decimal 대신 double을 사용할 수 있습니다. 그러나 성능 차이는 계산 집약적인 애플리케이션을 제외한 모든 애플리케이션에서 알지 못합니다.
decimal을 사용하지 않는 또 다른 이유는 스토리지 요구 사항을 최소화하는 것입니다.
예를 들어 ML.NET은 float을 사용합니다.
규모가 매우 큰 데이터 세트에서는 4바이트와 16바이트의 차이가 증폭되기 때문입니다. 
식에서 정수 형식과 float 및 double 형식을 혼합할 수 있습니다.
이 경우 정수 형식이 암시적으로 부동 소수점 형식 중 하나로 변환되며, 필요한 경우 flaot 형식이 암시적으로 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 접미사가 있는 리터럴은 flaot 형식입니다.
- 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# Value Type : 값 형식 - char  (0) 2023.01.17
C# Value Type : 값 형식 - bool  (0) 2023.01.16
C# Value Type : 값 형식 - 정수 숫자 형식  (0) 2023.01.12
C# Value Type : 값 형식  (0) 2023.01.12
C# Boxing 및 Unboxing : 박싱 및 언박싱  (0) 2023.01.11