在从双精度转换为十进制时避免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,转换时仍然会导致溢出吗?

在从双精度转换为十进制时避免OverflowException

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

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

相关文章:
  • 没有找到相关文章