При преобразовании double
(или float
) в decimal
возможны исключения переполнения. Так что я написал этот маленький метод расширения, который предотвращает это насыщение:Избегание переполнения Исключение при преобразовании с двойного на десятичный
public static decimal ToDecimalSafe(this double input)
{
try
{
return (decimal)input;
}
catch (OverflowException)
{
if (input < 0)
return decimal.MinValue;
else
return decimal.MaxValue;
}
}
Проблемы есть, это переполнение происходит довольно часто в моем случае использования, преодолев «исключения должны быть исключительными» руководство. Это замедляет приложение, да, но это не очень важно. Реальная проблема заключается в том, что в процессе отладки также возникает множество исключений с первым шансом, что вызывает раздражение. Вот попытка номер два, который, кажется, работает нормально:
public static decimal ToDecimalSafe(this double input)
{
if (input < (double)decimal.MinValue)
return decimal.MinValue;
if (input > (double)decimal.MaxValue)
return decimal.MaxValue;
try
{
return (decimal)input;
}
catch (OverflowException)
{
if (input < 0)
return decimal.MinValue;
else
return decimal.MaxValue;
}
}
Я оставил примерочных поймать, чтобы убедиться, я ловлю некоторые возможные случаи края. Вопрос здесь: есть ли какие-либо граничные случаи или я могу просто опустить попытку?
Может ли double
быть >= (double)decimal.MinValue
и <= (double)decimal.MaxValue
и по-прежнему вызывать переполнение при преобразовании?
Если это происходит довольно часто, почему, в первую очередь, вы используете 'десятичный', а не' double' в первую очередь? Похоже, вы используете 'decimal' для инженерных или научных вычислений, а не для финансовых, - это неправильная вещь. –
@MatthewWatson Ничего высокоточного или ничего. Это просто для взаимодействия между некоторыми аппаратными средствами, которые имеют дело с удвоениями и настройками, которые предоставляются пользователем и с использованием десятичного числа. Аппаратное обеспечение предоставляет ограничения, которые часто имеют смехотворно большой диапазон, который пользователю все равно не волнует. –
@MatthewWatson «Довольно часто» не означает 1000 раз в секунду, это означает 100-кратное общее количество при захвате этих предельных значений. –