13

我在 VS2015 C# 交互中运行了以下代码段,并得到了一些非常奇怪的行为。

> 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

4 回答 4

22

这是因为你使用System.Double.

正如MSDN DivideByZeroException所述,仅针对整数类型和Decimal.

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

PositiveInfinity 也是由零除以正被除数产生的,而 NegativeInfinity 由被零除产生负被除数产生。(来源:MSDN 再次

DivideByZeroException 不适用于浮点类型。注意:NaN当您尝试除以零且除数为零时,您可能会遇到问题。

于 2016-07-25T20:04:08.760 回答
2

为什么方法返回无穷大而 3 / 0 抛出错误而 3 / b 抛出格式化错误?

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

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

于 2016-07-25T20:04:16.527 回答
1

正如其他人在上面所说,这是由于您使用 double 作为除数。您可以通过使用您的变量示例但使用double而不是来证明这一点var

> double a = 3;
> double b = 0;
> a/b
∞
于 2016-07-25T20:08:00.913 回答
-1

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

于 2016-07-25T20:07:24.313 回答