在从双精度转换为十进制时避免OverflowException
本文关键字:OverflowException 十进制 双精度 转换 | 更新日期: 2023-09-27 18:16:29
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?
一个double
是>= (double)decimal.MinValue
和<= (double)decimal.MaxValue
,转换时仍然会导致溢出吗?
该异常将不再发生。你可以用这种方式修改你的代码。
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]属性