我在朋友的电脑上看过这个财务计算代码:
double Total = ...
double Paid = ...
double Wating_For_Details = ...
double Decuctibles = ...
double Rejected = ...
嗯,我看到这一刻,我告诉他double
代表base 2
,而 NOT 代表财务计算。请改用decimal
。
大
但是当我把它改为Ive遇到的那一刻:
Attempted to divide by zero.
HUH?
显然 - 使用double
,在使用0.0
进行分割时, NOT 会抛出异常:
但返回NAN
。
虽然我的代码(使用decimal
)会抛出异常(当Total
为zero
时)
所以我问:
我检查了0.0==0
并返回true。那么为什么我没有得到例外而是NAN
?我知道应该怎么做但是在将零除以零时不抛出异常的常见情况是什么?
答案 0 :(得分:16)
与具有整数类型的操作不同,后者在情况下抛出异常 溢出或非法操作,如除零,操作 使用浮点值不会抛出异常。相反,在 特殊情况,浮点运算的结果是 零,正无穷大,负无穷大,或不是数字(NaN):
答案 1 :(得分: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.");
答案 2 :(得分:2)
除以零(0.0)时,有一些特殊的double行为:
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仅针对Integer抛出(Decimal就像!)
答案 3 :(得分:0)
那是documented:
当操作结果未定义时,方法或运算符返回NaN。例如,将零除零的结果是NaN。
答案 4 :(得分:0)
http://msdn.microsoft.com/en-us/library/6a71f45d%28VS.80%29.aspx
浮点算术溢出或除零从不抛出 异常,因为浮点类型基于IEEE 754等 有代表无限和NaN(非数字)的规定。
this answer提供了一些好的背景