我在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是否包含捕获的异常所具有的所有相同信息和结构?
答案 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有一个可用的位模式),因此不需要例外。