Подтвердить что ты не робот

Получено исключение 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);
   }
}
4b9b3361

Ответ 1

Также проверьте double.IsNaN(value).

Сравнивает с NaN всегда значение false.

Ответ 2

Здесь источник от Microsoft 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")); 
}

Я не знаю, какую ценность вы его кормите, но ответ должен быть очевиден.

Ответ 3

Вы получаете исключение каждый раз, когда вы запускаете эту функцию с любым двойным значением?

Это сработало для меня.

Изменить: я создал программу со следующим кодом:

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);
            }
        }
    }
}