2016-11-04 5 views
1

При преобразовании 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 и по-прежнему вызывать переполнение при преобразовании?

+0

Если это происходит довольно часто, почему, в первую очередь, вы используете 'десятичный', а не' double' в первую очередь? Похоже, вы используете 'decimal' для инженерных или научных вычислений, а не для финансовых, - это неправильная вещь. –

+0

@MatthewWatson Ничего высокоточного или ничего. Это просто для взаимодействия между некоторыми аппаратными средствами, которые имеют дело с удвоениями и настройками, которые предоставляются пользователем и с использованием десятичного числа. Аппаратное обеспечение предоставляет ограничения, которые часто имеют смехотворно большой диапазон, который пользователю все равно не волнует. –

+0

@MatthewWatson «Довольно часто» не означает 1000 раз в секунду, это означает 100-кратное общее количество при захвате этих предельных значений. –

ответ

1

Исключение больше не произойдет. Вы можете изменить свой код таким образом.

public static decimal ToDecimalSafe(this double input) 
{ 
    if (input < (double)decimal.MinValue) 
     return decimal.MinValue; 
    else if (input > (double)decimal.MaxValue) 
     return decimal.MaxValue; 
    else 
     return (decimal)input; 
} 

Вы также можете использовать конкретный метод новообращенного, но это не мешает исключение

Convert.ToDecimal

Если проблема только отладки разрыв, что раздражает, то я предлагаю взглянуть на [DebuggerStepThrough] или [DebuggerHidden]

+0

Я понятия не имел об этих атрибутах, спасибо. Очень полезно. Кстати, я просто потратил пару минут на самом деле, пытаясь понять это сам, и кажется, что он дает (double) decimal.MinValue или (double) decimal.MaxValue в качестве входных данных вызывает исключение. Выполнение сравнения включительно (<= and > =) решает проблему, но мне нужно выяснить, как найти значение, которое немного находится в пределах, чтобы увидеть, если это произойдет. –

Смежные вопросы