将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次。 –