2013-07-04 32 views
13

我看到在我朋友的電腦這個財務覈算代碼:0.0/0.0在C#中不會拋出「嘗試除以零。」?

double Total = ... 
double Paid = ... 
double Wating_For_Details = ... 
double Decuctibles = ... 
double Rejected = ... 

嗯,我看到了這一刻,我告訴他,doublebase 2表示,並可以代表全面的財務覈算。改爲使用decimal

很好。

但我改變它的兩倍伊夫當下遇到:

Attempted to divide by zero.

吧?

顯然 - 使用double,與0.0將當它拋出異常:

enter image description here

但返回NAN

雖然我的代碼(使用decimal)不會拋出異常(當Totalzero

於是我問:

我檢查0.0==0,它返回true。所以爲什麼我沒有得到例外,但NAN?我知道那應該是怎麼回事,但是當把零除以零時,不會拋出異常的常見感覺在哪裏?

+3

「我檢查過了'0.0 == 0'」 - 你覺得那個實際檢查了什麼?兩邊的操作數都是不相等的類型,但是存在一個隱式的'int'到'double'的轉換 - 所以你實際檢查的是'0.0 == 0.0'。 –

+0

另外,你的問題有點像是拋出一個異常很顯然是在這種情況下做的正確的事情 - 在計算世界中存在許多權衡,並且往往沒有單一的「正確」方式來做事情。 –

+0

類似於http://stackoverflow.com/questions/4609698/inconsistency-in-divide-by-zero-behavior-between-different-value-types(即使不完全重複) – bigge

回答

5

參見http://msdn.microsoft.com/en-us/library/system.double.nan.aspx

的方法或操作員返回NaN時的操作的結果是不確定的。例如,零除零的結果是NaN,如以下示例所示。 (...) 另外,具有NaN值的方法調用或對NaN值的操作返回NaN,如以下示例所示。

下面的代碼示例說明了如何使用不同的NaN:

Double zero = 0; 

    // This condition will return false. 
    if ((0/zero) == Double.NaN) 
    Console.WriteLine("0/0 can be tested with Double.NaN."); 
    else 
    Console.WriteLine("0/0 cannot be tested with Double.NaN; use Double.IsNaN() instead."); 
16

不像整數類型,它通過零扔在案件溢出或違規操作的 例外,如師,操作 浮點值不拋出異常的操作。取而代之的是,在 特殊情況下,一個浮點操作的結果是 零,正無窮大,負無窮大,或不數字(NaN):

From Double on MSDN

0

documented

的方法或操作員返回NaN時的操作的結果是不確定的。例如,零除零的結果是NaN。

2

有雙重除以零時(0.0)的一些特殊行爲:

d/0.0 => Double.NaN if d==0.0 
d/0.0 => Double.PositiveInfinity if d>0.0 
d/0.0 => Double.NegativeInfinity if d<0.0 

DivideByZeroException僅拋出整數(十進制就是這樣!)

相關問題