为什么这个方法返回double.PositiveInfinity不是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是否包含捕获的exception所具有的所有相同信息和结构?

这是因为你使用System.Double

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

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

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

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

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

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

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

正如其他人在上面所说,这是由于你使用双倍作为除数。 您可以使用变量示例来certificate它,但使用double而不是var

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

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