Favicon

Floating-point numeric types

Peponi11/12/20245m

C#
SyntaxTypeNumeric

1. Introduction

모든 부동 소수점 형식은 값 형식이며 음수를 가질 수 있다. 산술, 등호, 비교 연산을 지원하고, 기본값으로 0을 가진다.

2. 부동 소수점 형식

C# 키워드.NET 형식값 범위전체 자릿수크기 (byte)비고
floatSystem.Single±1.5*10−45 ~ ±3.4*1038~ 6 - 94
doubleSystem.Double±5.0*10−324 ~ ±1.7*10308~ 15 - 178부동 소수점 리터럴 초기화 시 기본값
decimalSystem.Decimal±1.0*10−28 ~ ±7.9228*102828 - 2916

모든 부동 소수점 형식 키워드는 .NET 형식의 별칭으로, 서로 바꿔 사용 가능하다.

double a = 1.5;
System.Double b = 1.5;

모든 부동 소수점 형식에는 MinValue, MaxValue 프로퍼티가 컴파일 타임 상수로 제공되며 float, double 형식에는 숫자가 아닌 값 또는 무한 값을 나타내는 상수를 제공한다.

  • NaN : Not a Number
  • NegativeInfinity : 음의 무한대
  • PositiveInfinity : 양의 무한대

TIP

소수점 이하 값의 정확성이 중요한 경우에는 decimal 형식이 적합하다.
0.1이라는 수를 정확하게 표현해야 할 경우, floatdouble으로는 표현이 불가능하여 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 형식은 floatdouble 형식과 연산이 불가하다. 이 때, 명시적으로 decimal대상 형식으로 또는 반대로 변환해야한다.

double X = 1.0;
decimal Y = 1M;
 
double Z = X + (double)Y;
decimal W = (decimal)X + Y;

6. 참조 자료