【问题标题】:0.0/0.0 in C# won't throw "Attempted to divide by zero."?C# 中的 0.0/0.0 不会抛出“尝试除以零。”?
【发布时间】:2013-07-02 14:58:05
【问题描述】:

我在朋友的电脑上看到了这个财务计算代码:

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

好吧,当我看到这个时,我告诉他double 代表base 2 并且可以NOT 代表财务计算。请改用decimal

太棒了。

但是当我把它改成双倍的时候我遇到了:

Attempted to divide by zero.

嗯?

显然 - 使用 double ,当与 0.0 相除时,它确实 NOT 抛出异常:

但返回NAN

虽然我的代码(使用decimal)确实会引发异常(当Totalzero 时)

所以我问:

我检查了0.0==0,它返回 true。那么为什么我没有得到异常但NAN?我知道它应该是这样的,但是在将 double 除以零时不抛出异常的常识在哪里?

【问题讨论】:

  • “我检查了0.0==0” - 你认为实际检查了什么?两边的操作数的类型不相等,但存在 intdouble 的隐式转换 - 所以您实际检查的是 0.0==0.0
  • 另外,你的问题有点像抛出异常显然在这种情况下是正确的 - 在计算世界中有很多权衡,而且通常没有单一的“正确”做事方式。
  • 类似于stackoverflow.com/questions/4609698/…(即使不完全重复)

标签: c# .net double


【解决方案1】:

与整数类型的操作不同,它会在情况下抛出异常 溢出或非法操作,例如除以零,操作 带有浮点值的不会抛出异常。相反,在 特殊情况下,浮点运算的结果是 零、正无穷大、负无穷大或非数字 (NaN):

From Double on MSDN.

【讨论】:

    【解决方案2】:

    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.");
    

    【讨论】:

      【解决方案3】:

      double 除以零 (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 仅针对 Integer 抛出(Decimal 就像!)

      【讨论】:

        【解决方案4】:

        那是documented:

        当操作的结果未定义时,方法或运算符返回 NaN。例如,零除以零的结果是 NaN。

        【讨论】:

          【解决方案5】:

          http://msdn.microsoft.com/en-us/library/6a71f45d%28VS.80%29.aspx

          浮点算术溢出或除以零永远不会抛出 例外,因为浮点类型基于 IEEE 754 等 具有表示无穷大和 NaN(非数字)的规定。

          this answer 提供了一些很好的背景

          【讨论】:

            猜你喜欢
            • 2011-01-23
            • 1970-01-01
            • 1970-01-01
            • 2011-02-23
            • 2014-12-12
            • 2011-02-03
            • 1970-01-01
            • 2018-02-13
            相关资源
            最近更新 更多