2013-07-04 34 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仅抛出整数(十进制就是这样!)

相关问题