2016-07-25 108 views
8

我在VS2015 C#交互式代碼中運行了以下代碼片段,並且出現了一些非常奇怪的行爲。爲什麼此方法返回double.PositiveInfinity而不是DivideByZeroException?

> 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包含所有相同的信息和結構捕捉到的異常會嗎?

回答

14

這是因爲你使用System.Double。

MSDN所述,僅對整數類型和Decimal引發DivideByZeroException。

這是因爲很難爲Double值定義「所謂的」零。

PositiveInfinity時也通過零從分裂導致具有正 股息和NegativeInfinity結果從被零除用 負股息。 (來源:MSDN again

DivideByZeroException不適合於浮點類型。注意:儘管試圖用零除零,但您可以獲得NaN

1

爲什麼該方法返回無窮大,而3/0拋出一個錯誤和3/ b拋出一個格式錯誤?

因爲在第一種情況下0不是整數,所以是雙精度。而在第二個是一個整數。你應該在這裏意識到一個double是一個浮點數。所以它沒有像整數那樣的精確值。另一方面,整數可以由計算機以100%的準確度表示。

Here你可以找到關於浮點數的非常好的文章。

0

Java中的Int是2的補碼。二進制補碼整數沒有可用於存儲特殊值的位,如Infinity或NaN,因此結果不能用所需的類型表示,必須拋出異常。浮點數沒有這個問題(Infinity存在一個位模式),因此不需要例外。

+4

這個問題不是關於java的 – pquest

+0

我的不好!儘管它也適用於C#。 – codemonger

+1

@codemonger在數學上,N/0不等於無窮大。即使考慮到浮點數支持+/- +/- Infinity值,拋出異常比返回任何值更有意義。 NaN比無限更合適。 –

1

正如其他人所述,這是由於您使用double作爲除數。您可以使用變量示例來證明它,但使用double而不是var

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

謝謝你指出,我忘記了我曾經使用過var。將0指定爲無窮大的雙字面值。 –

相關問題