划分零点奇数

时间:2013-03-07 22:31:20

标签: c#

今天我遇到了一个问题,我偶然将其除以零,但没有例外被抛出。当我使用调试器时,我在调试器中看到了“NaN”。当我尝试用NUnit重新创建这个场景时,Assert说我正在返回'Infinity'。无法让调试器显示NaN,但我只是想知道为什么在这种情况下没有抛出错误?我花了很长时间来追踪这个问题,我会假设应该抛出异常吗?

以下是测试代码:

public class DivideByZero {

    private int TotalQaOneToFour;
    private int TotalGrade = 10;

    public DivideByZero(int TotalQaOneToFour) {
      this.TotalQaOneToFour = TotalQaOneToFour;
    }

    public Double QualityReportAverageRounded {
      get {
        return Math.Round((double)TotalGrade / TotalQaOneToFour, 2);
      }
    }
  }


  [TestFixture]
  public class DivideByZeroTest {

    [Test]
    public void TestThatDivideByZeroThrowsWhenUsingMathRound() {

      var dbz = new DivideByZero(0);

      Assert.AreEqual(0, dbz.QualityReportAverageRounded);
    }

  }

这是NUnit输出:

  

测试'DivideByZeroTest.TestThatDivideByZeroThrowsWhenUsingMathRound'   失败:
  预期:0
  但是:无限
  DivideByZero.cs(33,0):at   DivideByZeroTest.TestThatDivideByZeroThrowsWhenUsingMathRound()

     

0通过,1次失败,0次跳过,耗时0.41秒(NUnit 2.6.1)。

2 个答案:

答案 0 :(得分:13)

  

无法让调试器显示NaN,但我只是想知道为什么在这种情况下没有抛出错误?

因为这会违反规范:)基本上,这里不需要抛出异常因为IEEE-754 a)定义了如何处理除0; b)除以0的结果具有适当的值。对于整数类型(和decimal),这两种情况都不适用,这是你得到的DivideByZeroException

如果将任何非零,非NaN值除以零,则应获得无穷大(正或负)。如果将零(或NaN)除以零,则应获得NaN。

示例代码:

using System;

class Test
{
    static void Main()
    {
        // Prevent everything being computed at compile-time
        double zero = 0d;
        Console.WriteLine(1d / zero);  // Infinity
        Console.WriteLine(0d / zero);  // NaN
        Console.WriteLine(-1d / zero); // -Infinity
    }
}

从C#5规范部分7.8.2(其他编号适用于其他版本):

  

整数划分

     

[...]
  如果右操作数的值为零,则抛出System.DivideByZeroException   [...]

     

浮点除法

     

根据IEEE 754算法的规则计算商。下表列出了非零有限值,零,无穷大和NaN的所有可能组合的结果。

(然后有一张表给出了与我之前描述的结果相同的结果。)

答案 1 :(得分:1)

在浮点数中除以零,就像在这里一样,得到无穷大或非数字(NaN)。它在整数中除以零,导致异常。

将非零值除以零时会产生无穷大。将零除零时会产生NaN。