將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
並且在轉換時仍然會導致溢出?
如果這種情況經常發生,爲什麼你在第一時間使用'decimal'而不是'double'?這聽起來像你在工程或科學計算中使用「小數」而不是財務 - 這不是正確的做法。 –
@MthetheWWatson它沒有什麼高精度或任何東西。它只是用於處理用戶提供的雙精度和十進制設置的硬件之間的交互。硬件提供的限制通常具有可笑的大範圍,而用戶並不在乎。 –
@MatthewWatson「相當經常」並不意味着每秒1000次,這意味着抓住這些設置限制時總共達到100次。 –