3

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

4

1 回答 1

2

该异常将不再发生。您可以通过这种方式修改您的代码。

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] 属性

于 2016-11-04T09:29:40.400 回答