我在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是否包含所有与捕获异常相同的信息和结构?
发布于 2016-07-25 20:04:08
发布于 2016-07-25 20:04:16
为什么该方法返回无穷大,而3/0抛出一个错误,3/b抛出一个格式化错误?
因为在第一种情况下,0不是整数,是双倍。第二个是整数。你应该在这里意识到,双是一个浮点数。所以它没有一个像整数一样的精确值。另一方面,整数可以用计算机表示,准确率为100%。
这里你可以找到一篇很好的关于浮点数的文章。
发布于 2016-07-25 20:08:00
正如其他人前面所述,这是因为您使用double作为除数。您可以通过使用变量示例来证明这一点,但是可以使用double而不是var。
> double a = 3;
> double b = 0;
> a/b
∞https://stackoverflow.com/questions/38576361
复制相似问题