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
또는f
double
: 접미사가 없거나D
또는d
decimal
: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 = 2
5. 부동 소수점 연산
모든 부동 소수점 형식은 정수 형식과 연산이 가능하다.
var X = 1.0F + 2; // X = 3.0F
var Y = 1.0D + 2; // Y = 3.0D
var Z = 1.0M + 2; // Z = 3.0M
float
형식과 double
형식은 연산이 가능하다. (float
형식이 암시적으로 double
로 변환된다)
var X = 1.0F + 2.0D; // X = 3.0D
decimal
형식은 float
및 double
형식과 연산이 불가하다. 이 때, 명시적으로 decimal
을 대상 형식
으로 또는 반대로 변환해야한다.
double X = 1.0;
decimal Y = 1M;
double Z = X + (double)Y;
decimal W = (decimal)X + Y;