2016-11-04 36 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; 
    } 
} 

我離開的try-catch以確保我抓住了一些可能的邊緣情況。這裏的問題是:有沒有邊緣情況,或者我可以忽略try-catch?

Can a double is >= (double)decimal.MinValue and <= (double)decimal.MaxValue並且在轉換時仍然會導致溢出?

+0

如果這種情況經常發生,爲什麼你在第一時間使用'decimal'而不是'double'?這聽起來像你在工程或科學計算中使用「小數」而不是財務 - 這不是正確的做法。 –

+0

@MthetheWWatson它沒有什麼高精度或任何東西。它只是用於處理用戶提供的雙精度和十進制設置的硬件之間的交互。硬件提供的限制通常具有可笑的大範圍,而用戶並不在乎。 –

+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

我不知道這些屬性,謝謝。很有用。順便說一句,我花了幾分鐘的時間試圖自己弄清楚這一點,它似乎給予(雙)decimal.MinValue或(double)decimal.MaxValue作爲輸入引發異常。進行比較(包括<= and > =)解決了這個問題,但是我必須弄清楚如何找到一個稍微在範圍內的值來查看是否崩潰。 –