为什么这个方法 return double.PositiveInfinity 不是 DivideByZeroException?
Why does this method return double.PositiveInfinity not DivideByZeroException?
我 运行 在 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.
>
为什么方法 return infinity while 3 / 0 抛出错误而 3 / b 抛出格式化错误?我可以强制除法抛出错误而不是 returning infinity 吗?
如果我将方法重新格式化为
double divide(double a, double b)
{
if ( b == 0 )
{
throw new ArgumentException("Argument b must be non zero.", new DivideByZeroException());
}
return a / b;
}
新的 DivideByZeroException 是否包含与捕获的异常相同的所有信息和结构?
因为你使用了System.Double
.
如 MSDN 所述 DivideByZeroException
仅针对整数类型和 Decimal
.
抛出
那是因为很难为 Double 值定义 "so called" 零。
PositiveInfinity also results from a division by zero with a positive
dividend, and NegativeInfinity results from a division by zero with a
negative dividend.
(source: MSDN again)
DivideByZeroException 不适用于浮点类型。注意:您可以得到 NaN
虽然当尝试除以零且被除数为零时。
Why did the method return infinity while 3 / 0 threw an error and 3 /
b threw a formated error?
因为在第一种情况下 0 不是整数,而是双精度数。而在第二个是一个整数。您在这里应该意识到双精度数是一个浮点数。所以它没有像整数那样的精确值。另一方面,计算机可以 100% 准确地表示整数。
Here 你可以找到一篇关于浮点数的非常好的文章。
Int in Java 是 2 的补码。二进制补码整数没有任何位可用于存储特殊值,如 Infinity 或 NaN,因此由于结果无法以所需类型表示,因此必须抛出异常。浮点数没有这个问题(Infinity 有一个位模式可用),因此不需要例外。
正如上面其他人所说,这是因为您使用 double 作为除数。您可以通过使用您的变量示例来证明它,但使用 double
而不是 var
.
> double a = 3;
> double b = 0;
> a/b
∞
我 运行 在 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.
>
为什么方法 return infinity while 3 / 0 抛出错误而 3 / b 抛出格式化错误?我可以强制除法抛出错误而不是 returning infinity 吗?
如果我将方法重新格式化为
double divide(double a, double b)
{
if ( b == 0 )
{
throw new ArgumentException("Argument b must be non zero.", new DivideByZeroException());
}
return a / b;
}
新的 DivideByZeroException 是否包含与捕获的异常相同的所有信息和结构?
因为你使用了System.Double
.
如 MSDN 所述 DivideByZeroException
仅针对整数类型和 Decimal
.
那是因为很难为 Double 值定义 "so called" 零。
PositiveInfinity also results from a division by zero with a positive dividend, and NegativeInfinity results from a division by zero with a negative dividend. (source: MSDN again)
DivideByZeroException 不适用于浮点类型。注意:您可以得到 NaN
虽然当尝试除以零且被除数为零时。
Why did the method return infinity while 3 / 0 threw an error and 3 / b threw a formated error?
因为在第一种情况下 0 不是整数,而是双精度数。而在第二个是一个整数。您在这里应该意识到双精度数是一个浮点数。所以它没有像整数那样的精确值。另一方面,计算机可以 100% 准确地表示整数。
Here 你可以找到一篇关于浮点数的非常好的文章。
Int in Java 是 2 的补码。二进制补码整数没有任何位可用于存储特殊值,如 Infinity 或 NaN,因此由于结果无法以所需类型表示,因此必须抛出异常。浮点数没有这个问题(Infinity 有一个位模式可用),因此不需要例外。
正如上面其他人所说,这是因为您使用 double 作为除数。您可以通过使用您的变量示例来证明它,但使用 double
而不是 var
.
> double a = 3;
> double b = 0;
> a/b
∞