HOWTO · Csharp

C#에서 decimal을 int로 변환

C#에서 decimal을 int로 변환할 때 절단, 가장 가까운 정수로의 반올림 또는 방향 지정 반올림을 선택하고 Int32 범위를 벗어난 값을 처리하는 방법을 설명합니다.

이 페이지의 내용

소수 부분을 버리려면 (int)value를 사용하세요. 가장 가까운 정수로 반올림하려면 Convert.ToInt32(value)를 사용하고, 방향이 지정되었거나 중간값 처리 규칙이 정해져 있다면 Math 메서드를 사용하세요. 다음의 간단한 예제는 양수 값으로 이러한 선택지를 비교합니다.

using System;

class Program
{
    static void Main()
    {
        decimal value = 12.9m;
        Console.WriteLine("cast: " + (int)value);
        Console.WriteLine("nearest: " + Convert.ToInt32(12.5m) + ", " + Convert.ToInt32(13.5m));
        Console.WriteLine("floor: " + Math.Floor(value));
        Console.WriteLine("ceiling: " + Math.Ceiling(value));
        Console.WriteLine("away: " + Math.Round(2.5m, MidpointRounding.AwayFromZero));
    }
}
cast: 12
nearest: 12, 14
floor: 12
ceiling: 13
away: 3

위 출력은 코드를 실행했을 때의 예상 출력입니다. 변환 정책은 표시 형식이 아니라 업무 규칙입니다. 금액이나 측정값처럼 소수 부분이 계속 의미를 갖는 경우에는 값을 decimal로 유지하세요. 최종적으로 int로 변환할 때는 Int32에 들어가지 않는 값도 반드시 고려해야 합니다.

decimal을 0을 향해 절단하기

절단에는 명시적 캐스트 (int)value가 가장 분명한 선택입니다. decimal 리터럴에는 m 접미사가 필요하므로, 접미사가 없는 12.9와 같은 리터럴은 double입니다. decimal을 정수 형식으로 변환하면 0을 향해 반올림합니다. 따라서 (int)12.9m은 12이고 (int)-12.9m은 -12입니다. 이는 내림이나 올림과는 다릅니다. C# 숫자 변환 참고 자료에서 0을 향한 동작과 범위 초과 실패를 설명합니다.

가장 가까운 정수로 반올림하기

Convert.ToInt32(decimal)는 절단하지 않고 가장 가까운 32비트 부호 있는 정수로 반올림합니다. 소수 부분이 정확히 .5인 경우에는 중간값을 짝수 쪽으로 반올림합니다. 따라서 Convert.ToInt32(12.5m)은 12가 되고 Convert.ToInt32(13.5m)은 14가 됩니다. 가장 가까운 정수 단위로 맞춰야 하는 측정값에는 유용하지만, 모든 중간값을 0에서 멀어지는 방향으로 처리해야 한다면 적합하지 않습니다.

애플리케이션에 필요한 정책이 중간값을 짝수로 반올림하는 것인지 확인한 후에만 Convert.ToInt32를 선택하세요. Convert.ToInt32의 decimal 오버로드 문서에는 값이 int 범위를 벗어나면 OverflowException이 발생한다고 명시되어 있습니다. 이 메서드가 범위를 초과한 decimal 값을 안전한 값으로 바꾸어 주는 것은 아닙니다.

명시적인 반올림 규칙 선택하기

먼저 decimal에 Math 메서드를 적용한 다음 정수가 된 결과를 변환하세요. Math.Floor는 음의 무한대를 향하므로 Math.Floor(-12.9m)는 -13m입니다. Math.Ceiling은 양의 무한대를 향합니다. 따라서 두 메서드 모두 (int)-12.9m의 결과인 -12와 다릅니다.

가장 가까운 값으로 반올림하되 중간값 규칙을 명시하려면 Math.Round(value, MidpointRounding.AwayFromZero)를 사용하세요. 이 메서드는 2.5m을 3m으로, -2.5m을 -3m으로 만듭니다. 기본 Math.Round(decimal)는 중간값을 짝수로 반올림합니다. Math.Truncate는 0을 향해 정수화된 decimal을 얻은 후 int로 변환하는 또 다른 읽기 쉬운 방법입니다.

반올림하기 전에 캐스트하지 마세요. (int)value는 이미 소수 부분을 버렸으므로 그 후에 Math.Round를 호출해도 원래 의도한 선택을 복원할 수 없습니다. 먼저 반올림하고 결과를 확인한 다음 캐스트하세요.

int 범위를 벗어난 값 처리하기

int는 int.MinValue와 int.MaxValue 사이의 값을 나타내는 32비트 부호 있는 정수이며, Int32는 이에 해당하는 프레임워크 형식입니다. decimal은 이 경계를 넘어서는 값도 표현할 수 있습니다. decimal을 int로 변환한 결과가 범위를 벗어나면 변환에서 OverflowException이 발생하며, 값을 끝점으로 자동 제한하지 않습니다.

범위를 벗어난 입력이 들어올 수 있다면 변환 전에 값을 검증하거나 애플리케이션 경계에서 OverflowException을 처리하세요. checked 변환은 의도를 명시하고 범위 계약을 테스트하는 데 도움이 될 수 있지만, decimal에서 int로 변환할 때 오버플로를 감지하는 메커니즘은 아닙니다. 수신 계약에서 허용한다면 값을 억지로 int에 넣는 대신 decimal을 유지하거나 더 넓은 정수 형식을 선택하세요.

규칙에 맞는 변환 선택하기

원하는 결과 사용할 방법 중요한 동작
소수 부분 버리기 (int)value 0을 향해 절단합니다.
가장 가까운 int Convert.ToInt32(value) 중간값을 짝수로 반올림합니다.
항상 내림 또는 올림 Math.Floor 또는 Math.Ceiling을 적용한 후 캐스트 음수에서는 방향 지정 반올림이 절단과 다릅니다.
사용자 지정 중간값 동작 MidpointRounding을 사용한 Math.Round 후 캐스트 동률 처리 규칙을 명시해야 합니다.

일반적인 절단에는 명시적 캐스트를 사용하세요. 애플리케이션에 필요한 반올림 정책이 그 방법의 정책과 일치할 때만 Convert.ToInt32 또는 Math 메서드를 선택하고, int 경계에서는 OverflowException을 처리하세요.