Ответ 1
Также проверьте double.IsNaN(value)
.
Сравнивает с NaN
всегда значение false.
В приведенном ниже методе в последней строке я получаю исключение:
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);
}
}
Также проверьте double.IsNaN(value)
.
Сравнивает с NaN
всегда значение false.
Здесь источник от 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"));
}
Я не знаю, какую ценность вы его кормите, но ответ должен быть очевиден.
Вы получаете исключение каждый раз, когда вы запускаете эту функцию с любым двойным значением?
Это сработало для меня.
Изменить: я создал программу со следующим кодом:
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);
}
}
}
}