【问题标题】:Why doesn't dividing by zero with doubles throw an exception?为什么用双精度除以零不会引发异常?
【发布时间】:2018-02-23 09:39:29
【问题描述】:

这是代码:

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”。这是为什么呢?

【问题讨论】:

  • 那是整数。
  • 添加了c#。也许乔恩·斯基特会来。
  • "除以零的结果在数学上是未定义的,可以用浮点数/双精度表示(如 NaN - 不是数字),但是,它不是,在任何基本意义上都是错误的。由于整数必须包含特定的数值,因此在处理它们时必须在除以零时引发错误。“我虽然在 Java 的上下文中看到了这个解释,但我相信同样是也适用于 c#
  • “为什么”的问题很难回答。您是在问“规范的哪一行定义了这种行为?”还是“谁编写了规范的那一行?”或“IEEE 浮点格式的历史是什么?”或“什么设计考虑使双算术和整数算术不同?”或者是什么?回答这些问题中的任何一个都可以合理地回答“为什么”世界是这样的,而且它们都是不同的。 问一个更精确的问题

标签: c# exception


【解决方案1】:

原因很简单:DivideByZeroException 不是为浮点数设计的。

根据MSDN

尝试将整数或小数值除以零时引发的异常。

不过,它不适用于浮点值。根据IEEE 754,浮点数异常包括:

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

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

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;
    }
}

【讨论】:

  • 如果你做 3/2 会返回 1
【解决方案2】:

MSDN 解释说,DivideByZeroException 仅在“[当] 尝试将 整数十进制 数除以零时”被抛出,而

浮点运算返回 PositiveInfinity 或 NegativeInfinity 表示溢出条件。

改用Double.IsInfinity()

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

【讨论】:

    【解决方案3】:

    将浮点值除以零不会引发异常;根据 IEEE 754 算术规则,它会导致正无穷大、负无穷大或非数字 (NaN)。由于以下示例使用浮点除法而不是整数除法,因此该操作不会引发 DivideByZeroException 异常。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-17
      • 2020-07-16
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      相关资源
      最近更新 更多