将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
会导致溢出?