2016-11-04 73 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 > =)解决了这个问题,但是我必须弄清楚如何找到一个稍微在范围内的值来查看是否崩溃。 –