为什么这个方法返回double.PositiveInfinity不是DivideByZeroException?

时间:2016-07-25 19:57:41

标签: c# exception-handling infinity dividebyzeroexception

我在VS2015 C#interactive中运行了以下代码片段并且有一些非常奇怪的行为。

> double divide(double a, double b)
. {
.     try
.     {
.         return a / b;
.     }
.     catch (DivideByZeroException exception)
.     {
.         throw new ArgumentException("Argument b must be non zero.", exception);
.     }
. }    
> divide(3,0)
Infinity    
> 3 / 0
(1,1): error CS0020: Division by constant zero
> var b = 0;
> 3 / b
Attempted to divide by zero.
> 

为什么方法返回无穷大而3/0引发错误并且3 / b抛出格式化错误?我可以强制分裂抛出错误而不是返回无穷大吗?

如果我将方法重新格式化为

double divide(double a, double b)
{
    if ( b == 0 )
    {
        throw new ArgumentException("Argument b must be non zero.", new DivideByZeroException());
    }
    return a / b;
}

新的DivideByZeroException是否包含捕获的异常所具有的所有相同信息和结构?

4 个答案:

答案 0 :(得分:17)

这是因为您使用System.Double

MSDN DivideByZeroException所述,仅针对整数类型和Decimal投放。

那是因为很难为Double值定义“所谓的”零。

  

PositiveInfinity也是由零除以正值产生的   dividend和NegativeInfinity是由零除以a得到的   负股息。   (来源:MSDN again

DivideByZeroException不适用于浮点类型。注意:虽然尝试除以零并且红利为零,但您可以获得NaN

答案 1 :(得分:2)

  

为什么该方法返回无穷大而3/0引发错误并且3 /   b抛出了格式错误?

因为在第一种情况下0不是整数,所以是双精度数。而在第二个是整数。你应该意识到,double是一个浮点数。所以它没有像整数那样的精确值。另一方面,整数可由计算机表示,准确度为100%。

Here你可以找到一篇关于浮点数的非常好的文章。

答案 2 :(得分:1)

正如其他人所说,这是由于你使用双倍作为除数。您可以使用变量示例来证明它,但使用double代替var

> double a = 3;
> double b = 0;
> a/b
∞

答案 3 :(得分:-1)

Int in Java是2的补充。二进制补码整数没有任何可用于存储特殊值(如Infinity或NaN)的位,因此由于结果无法在所需类型中表示,因此必须抛出异常。浮点数没有这个问题(Infinity有一个可用的位模式),因此不需要例外。

相关问题