今天我遇到了一个问题,我偶然将其除以零,但没有例外被抛出.当我使用调试器时,我在调试器中看到了"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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是NUnit输出:
测试'DivideByZeroTest.TestThatDivideByZeroThrowsWhenUsingMathRound'失败:
预期:0
但是:Infinity
DivideByZero.cs(33,0):在DivideByZeroTest.TestThatDivideByZeroThrowsWhenUsingMathRound()0传递,1失败,0跳过,耗时0.41秒(NUnit 2.6.1).
Jon*_*eet 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
}
}
Run Code Online (Sandbox Code Playgroud)
从C#5规范部分7.8.2(其他编号适用于其他版本):
整数除法
[...]
如果右操作数的值为零,则抛出System.DivideByZeroException.
[...]浮点除法
根据IEEE 754算法的规则计算商.下表列出了非零有限值,零,无穷大和NaN的所有可能组合的结果.
(然后有一张表给出了与我之前描述的相同的结果.)