prosource

C#에서 소수점을 int로 변환하려면 어떻게 해야 합니까?

probook 2023. 6. 2. 20:37
반응형

C#에서 소수점을 int로 변환하려면 어떻게 해야 합니까?

소수점을 int로 변환하려면 어떻게 해야 합니까?

사용하다Convert.ToInt32mscorlib에 있어서와 같이

decimal value = 3.14m;
int n = Convert.ToInt32(value);

MSDN을 참조하십시오.사용할 수도 있습니다.Decimal.ToInt32다시 MSDN을 참조하십시오.마지막으로 직접 캐스팅을 할 수 있습니다.

decimal value = 3.14m;
int n = (int) value;

명시적 캐스트 연산자를 사용합니다.MSDN을 참조하십시오.

그럴수는 없어요.

음, 물론 그럴 수 있지만, 아무리 int(시스템)이라도.Int32)는 모든 가능한 십진수 값을 포함할 만큼 충분히 크지 않습니다.

즉, int보다 큰 소수점을 던지면 됩니다.MaxValue는 소수점이 int보다 작으면 오버플로가 발생합니다.MinValue, 언더플로가 발생합니다.

언더플로/오버플로 시 어떻게 됩니까?두 가지 중 하나.빌드를 선택하지 않은 경우(즉, CLR에서 선택하지 않은 경우), 해당 값이 오버플로/언더플로된 후에도 응용 프로그램이 계속되지만 int의 값은 사용자가 예상한 값이 아닙니다.이로 인해 간헐적인 버그가 발생할 수 있으며 해결하기 어려울 수 있습니다.응용프로그램이 알 수 없는 상태로 종료되어 응용프로그램이 작동하는 중요한 데이터가 손상될 수 있습니다.좋지 않습니다.

어셈블리를 선택한 경우(속성 ->빌드 ->고급 ->산술 오버플로/언더플로 또는 /체크된 컴파일러 옵션), 코드는 언더플로/오버플로가 발생할 때 예외를 던집니다.이 방법이 그렇지 않은 것보다 나을 수도 있지만 어셈블리의 기본값은 오버플로/언더플로를 확인하지 않는 것입니다.

진짜 질문은 "당신은 무엇을 하려고 하는가?"입니다.여러분의 요구 사항을 모르면, 아무도 여러분에게 이 경우에 여러분이 무엇을 해야 하는지 알려줄 수 없습니다: 하지 마세요.

특별히 상관하지 않는 경우 여기에 제시된 답변은 유효합니다.그러나 오버플로가 발생할 수 있으며 캐스트 코드를 선택하지 않은 블록으로 감싸면 문제가 되지 않는다는 점을 이해해야 합니다.

unchecked
{
  // do your conversions that may underflow/overflow here
}

이렇게 하면 여러분 뒤에 오는 사람들은 여러분이 신경 쓰지 않는다는 것을 이해할 수 있고, 나중에 누군가가 여러분의 빌드를 /체크로 변경하더라도 여러분의 코드가 예기치 않게 깨지지 않을 것입니다.

정수 부분을 남기고 숫자의 분수 부분을 떨어뜨리는 것만 원하는 경우 수학을 사용할 수 있습니다.잘라냅니다.

decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
int i = (int)d;

반올림한 숫자를 알려드리겠습니다.

가장 가까운 짝수(즉, >.5가 반올림됨)로 반올림하려면 사용할 수 있습니다.

int i = (int)Math.Round(d, MidpointRounding.ToEven);

일반적으로 C#의 모든 숫자 유형 사이에 캐스팅할 수 있습니다.캐스팅 도중 손실되는 정보가 없는 경우 암시적으로 다음 작업을 수행할 수 있습니다.

int i = 10;
decimal d = i;

다음과 같은 경우에도 명시적으로 수행할 수 있습니다.

int i = 10;
decimal d = (decimal)i;

그러나 캐스트를 통해 정보를 손실하려는 경우에는 정보를 손실할 수 있다는 것을 보여주기 위해 이를 명시적으로 수행해야 합니다.

decimal d = 10.5M;
int i = (int)d;

여기서 당신은 ".5"를 잃고 있습니다.이것은 괜찮을지 모르지만, 당신은 그것에 대해 분명하게 말하고 당신이 정보를 잃어버릴 수도 있다는 것을 보여주기 위해 명시적인 캐스팅을 해야 합니다.

decimal d = 2;
int i = (int) d;

이것은 잘 작동할 것입니다.

decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);

여기 다른 사람들을 위한 매우 편리한 변환 데이터 유형 웹 페이지가 있습니다.http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html

소수점을 가장 가까운 정수로 반올림

decimal a ;
int b = (int)(a + 0.5m);

언제a = 49.9,그리고나서b = 50

언제a = 49.5,그리고나서b = 50

언제a = 49.4,그리고나서b = 49기타.

System.Decimal을 구현합니다.IConvertable인터페이스, 이 인터페이스는ToInt32()회원의

호출합니까?System.Decimal.ToInt32()당신을 위해 일합니까?

빠른 반올림을 위한 깔끔한 방법은 소수점을 int에 던지기 전에 .5를 추가하는 것입니다.

decimal d = 10.1m;
d += .5m;
int i = (int)d;

아직도 떠남i=10,그렇지만

decimal d = 10.5m;
d += .5m;
int i = (int)d;

그러도록 정리하겠습니다.i=11.

저는 수학을 더 좋아합니다.동그랗게, 수학.바닥, 수학.천장 또는 수학.반올림 모드를 적절하게 명시적으로 설정하려면 잘라냅니다.

모두 Decimal을 반환합니다. Decimal은 Int32보다 값 범위가 넓기 때문에 계속 캐스트해야 합니다(과 오버플로/언더플로 확인).

 checked {
   int i = (int)Math.Floor(d);
 }

십진의d = 5.5;

int i = decimal.ToInt32(d);// you will get i = 5

참조: 링크 텍스트

오버플로를 처리하는 답이 없습니다.예외/언더플로int 범위 밖에 있는 소수점을 변환하려고 할 때 발생하는 예외입니다.

int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));

이 솔루션은 십진수 값이 int 범위를 벗어나는 경우 가능한 최대값 또는 최소값을 반환합니다.수학을 사용하여 반올림을 추가할 수 있습니다.동그랗게, 수학.천장 또는 수학.값이 범위 내에 있을 때의 바닥입니다.

상자에 표시된 소수(즉, 객체 유형 내부의 소수 값)가 있으면 주조 연산자가 작동하지 않습니다.변환합니다.ToInt32(개체로 소수)는 이 경우에 잘 작동합니다.

데이터베이스에서 IDENTITY/AUTONUMBER 값을 검색할 때 다음과 같은 상황이 발생합니다.

SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar());  // works
int ID = (int)foo.ExecuteScalar();              // throws InvalidCastException

4.3.2 박스 해제 변환 참조

십진수를 정수로 변환

decimal decimalValue=5.00;
int intValue=Convert.ToInt32(decimalValue);

언급URL : https://stackoverflow.com/questions/501090/how-do-i-convert-a-decimal-to-an-int-in-c

반응형