2011-03-04 4 views
12

맞았 아래의 마지막 줄에 항상 예외가 받고 있어요 :이 방법에서, OverflowException

System.OverflowException: Value was either too large or too small for an Int32. 

정말 설명 할 수 없다 왜 그 명시 적으로 확인하고 있습니다 때문에 :

private Int32 ConvertValue(double value) 
{ 
    if (value > Int32.MaxValue) 
    { 
     Console.WriteLine("Couldn't convert value " + value + " to Int32"); 
     return Int32.MaxValue; 
    } 
    else if (value < Int32.MinValue) 
    { 
     Console.WriteLine("Couldn't convert value " + value + " to Int32"); 
     return Int32.MinValue; 
    } 
    else 
    { 
     return Convert.ToInt32(value); 
    } 
} 
+1

예외가 발생했을 때'value'의 값은 무엇입니까? – Blorgbeard

+0

'unchecked {}'블록에 모두 쓰려고 시도하십시오 – nothrow

+4

value == double.NaN이면 어떨까요? 나는 이것이 당신의 시험 중 하나를 통과 할 것 같지 않습니다. –

답변

14

는 또한 double.IsNaN(value)을 확인 : 나는 다음과 같은 코드를 사용하여 프로그램을 만들었습니다.

NaN과 항상 비교하면 false가 반환됩니다.

+0

+1. 잘 부탁드립니다. 귀하의 대답을 테스트하고 오류가 발생했습니다 일부 코드를 썼습니다. double d = Double.NaN; int i = Convert.ToInt32 (d); – David

0

이중 값으로이 함수를 실행할 때마다 예외가 발생합니까?

그것은 나를 위해 잘 작동했습니다.

편집 :

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace test1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Int32 myInt = ConvertValue(86389327923.678); 
      Console.WriteLine(myInt); 
        myInt = ConvertValue(-86389327923.678); 
      Console.WriteLine(myInt); 
        myInt = ConvertValue(8.678); 
      Console.WriteLine(myInt); 
      Console.ReadKey(); 
     } 

     static private Int32 ConvertValue(double value) 
     { 
      if (value > Int32.MaxValue) 
      { 
       Console.WriteLine("Couldn't convert value " + value + " to Int32"); 
       return Int32.MaxValue; 
      } 
      else if (value < Int32.MinValue) 
      { 
       Console.WriteLine("Couldn't convert value " + value + " to Int32"); 
       return Int32.MinValue; 
      } 
      else 
      { 
       return Convert.ToInt32(value); 
      } 
     } 
    } 
} 
+4

"나를 위해 잘 돌아갔습니다"는 개발자 죄입니다 – GenericTypeTea

+0

항상 저에게는 잘 작동하지만 버그는 계속 발생하고 있습니다 ... – spender

+0

나는 정확히 내가 쓴 것을 추가했습니다. 코드에 문제가있는 경우이 코드와 맞지 않습니다 -이 질문에 대한 유효한 대답입니다 –

3

여기에 마이크로 소프트의 Convert.cs에서 소스입니다 :

public static int ToInt32(double value) { 
    if (value >= 0) { 
     if (value < 2147483647.5) { 
      int result = (int)value; 
      double dif = value - result; 
      if (dif > 0.5 || dif == 0.5 && (result & 1) != 0) result++; 
      return result; 
     } 
    } 
    else { 
     if (value >= -2147483648.5) { 
      int result = (int)value; 
      double dif = value - result; 
      if (dif < -0.5 || dif == -0.5 && (result & 1) != 0) result--; 
      return result; 
     } 
    } 
    throw new OverflowException(Environment.GetResourceString("Overflow_Int32")); 
} 

당신이 그것을 공급하는 맞춤 모르겠어요,하지만 대답은 이제 명백해야한다.

+0

그는 Int32.MaxValue 및 Int32.MinValue를 사용하여 입력을 테스트하기 때문에 전혀 이해가되지 않습니다. – krtek

+0

@Krtek : 어떤 값이 입력되는지 알고 있다면 그렇게 될 것입니다. 그러나 OP 만 알고 있습니다. 예를 들어 그것은 NaN입니다. – Jon

관련 문제