Floating-point numeric types
Peponi │ 11/12/2024 │ 5m
Floating-point numeric types
Peponi
1. Introduction
모든 부동 소수점 형식은 값 형식이며 음수를 가질 수 있다. 산술, 등호, 비교 연산을 지원하고, 기본값으로 0을 가진다.
2. 부동 소수점 형식
| C# 키워드 | .NET 형식 | 값 범위 | 전체 자릿수 | 크기 (byte) | 비고 |
|---|---|---|---|---|---|
| float | System.Single | ±1.5*10−45 ~ ±3.4*1038 | ~ 6 - 9 | 4 | |
| double | System.Double | ±5.0*10−324 ~ ±1.7*10308 | ~ 15 - 17 | 8 | 부동 소수점 리터럴 초기화 시 기본값 |
| decimal | System.Decimal | ±1.0*10−28 ~ ±7.9228*1028 | 28 - 29 | 16 |
모든 부동 소수점 형식 키워드는 .NET 형식의 별칭으로, 서로 바꿔 사용 가능하다.
double a = 1.5;
System.Double b = 1.5;모든 부동 소수점 형식에는 MinValue, MaxValue 프로퍼티가 컴파일 타임 상수로 제공되며 float, double 형식에는 숫자가 아닌 값 또는 무한 값을 나타내는 상수를 제공한다.
NaN: Not a NumberNegativeInfinity: 음의 무한대PositiveInfinity: 양의 무한대
TIP
소수점 이하 값의 정확성이 중요한 경우에는 decimal 형식이 적합하다.
0.1이라는 수를 정확하게 표현해야 할 경우, float과 double으로는 표현이 불가능하여 decimal을 사용한다.
규모가 큰 DB를 다루는 경우에는 가능한 작은 크기의 형식을 사용한다.
3. 부동 소수점 초기화
부동 소수점 초기화 시 _를 이용하여 자리를 구분할 수 있고, E를 사용하여 지수부 표현을 할 수 있다. 초기화 또는 연산 시 값이 형식.MinValue보다 작으면 -∞, 형식.MaxValue보다 크면 ∞가 된다.
var testReal = 1_000.12_3; // 1000.123
var testReal1 = 1E4; // 10000
var testReal2 = double.MaxValue * 2; // ∞
var testReal3 = float.MinValue * 2; // -∞리터럴을 이용한 초기화 시에는 접미사에 따라 형식이 결정된다.
float:F또는fdouble: 접미사가 없거나D또는ddecimal:M또는m
var floatValue = 0.1F;
var doubleValue = 0.1;
var doubleValue2 = 0.1D;
var decimalValue = 0.1M;4. 부동 소수점 형식 변환 (캐스팅)
부동 소수점 형식 변환 간 암시적 변환은 float -> double만 지원된다. 명시적 변환을 이용하여 부동 소수점 형식 변환이 가능한데, 캐스트 식을 사용한다.
부동 소수점 형식을 정수 형식으로 변환하는 경우에는 소수점 자리 반올림 오류가 발생할 수 있다. (기본적으로 버림 처리한다)
double castingDouble = 1.6;
int castingInt = (int)castingDouble; // castingInt = 1
double castingDouble2 = 1.5;
int castingInt2 = (int)Math.Round(castingDouble2); // castingInt2 = 25. 부동 소수점 연산
모든 부동 소수점 형식은 정수 형식과 연산이 가능하다.
var X = 1.0F + 2; // X = 3.0F
var Y = 1.0D + 2; // Y = 3.0D
var Z = 1.0M + 2; // Z = 3.0Mfloat 형식과 double 형식은 연산이 가능하다. (float 형식이 암시적으로 double로 변환된다)
var X = 1.0F + 2.0D; // X = 3.0Ddecimal 형식은 float 및 double 형식과 연산이 불가하다. 이 때, 명시적으로 decimal을 대상 형식으로 또는 반대로 변환해야한다.
double X = 1.0;
decimal Y = 1M;
double Z = X + (double)Y;
decimal W = (decimal)X + Y;