除以零怪数

本文关键字: | 更新日期: 2023-09-27 18:02:56

我今天遇到了一个问题,我不小心除以零,但没有抛出异常。当我使用调试器时,我在调试器中看到'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
而是:Infinity
DivideByZero.cs(33岁,0):DivideByZeroTest.TestThatDivideByZeroThrowsWhenUsingMathRound ()

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

除以零怪数

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

因为这会违反规范:)基本上,这里没有必要抛出异常,因为IEEE-754 a)定义了应该如何处理除0;B)对于除0的结果有合适的值。对于整数类型(和decimal),这两种情况都不成立,这就是得到DivideByZeroException的原因。

如果你将任何非零,非nan值除以零,你应该得到无穷大(正或负)。如果你用0(或NaN)除以0,你应该得到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节(其他编号适用于其他版本):

整数除法

[…]
如果右操作数的值为0,则为System。DivideByZeroException被抛出。
[…)

浮点除法

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

(然后有一个表给出与我前面描述的相同类型的结果)

在浮点数中除零,就像这里一样,结果要么是无穷大,要么是非数字(NaN)。整数除零会导致异常。

当一个非零值除以零时,产生

无穷大。NaN是0除以0得到的。

相关文章:
  • 没有找到相关文章