为什么不用双精度除以零抛出异常?

时间:2018-02-22 14:25:55

标签: c# exception

这是代码:

class Program
{
    static void Main(string[] args)
    {
        double varrr = Divide(10, 0);
    }

    static double Divide(double a, double b)
    {
        double c = 0;
        try
        {
            c = a / b;
            return c;
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Division by zero not allowed");
            return 0;
        }
    }

}

我希望除以零来抛出DivideByZeroException,但它没有,当我在控制台上打印结果时输出为" Infinity"。那是为什么?

3 个答案:

答案 0 :(得分:3)

MSDN解释说DivideByZeroException只会被抛出" [当]试图将整数十进制数字除以零"而

  

浮点运算返回PositiveInfinity或NegativeInfinity   发出溢出信号。

改为使用Double.IsInfinity()

if (double.IsInfinity(c))
{
    Console.WriteLine("Division by zero not allowed");
    return 0;
}

答案 1 :(得分:2)

原因很简单:DivideByZeroException不适用于浮点数。

根据MSDN

  

尝试将积分或十进制值除以零时抛出的异常。

因此,它不适用于浮点值。根据{{​​3}},浮点数例外包括:

  
      
  • 除以零(对有限操作数的操作给出精确的无限结果,例如1/0或log(0))(默认返回±无穷大
  •   

如果您真的想要查看异常,则需要此代码:

static double Divide(int a, int b)
{
    int c = 0;
    try
    {
        c = a / b;
        return c;
    }
    catch (DivideByZeroException)
    {
        Console.WriteLine("Division by zero not allowed");
        return 0;
    }
}

答案 2 :(得分:1)

将浮点值除以零不会引发异常;根据IEEE 754算法的规则,它产生正无穷大,负无穷大或不是数字(NaN)。因为以下示例使用浮点除法而不是整数除法,所以该操作不会抛出DivideByZeroException异常。

https://msdn.microsoft.com/en-us/library/system.dividebyzeroexception(v=vs.110).aspx