【发布时间】:2011-06-04 07:51:08
【问题描述】:
请考虑以下代码和 cmets:
Console.WriteLine(1 / 0); // will not compile, error: Division by constant zero
int i = 0;
Console.WriteLine(1 / i); // compiles, runs, throws: DivideByZeroException
double d = 0;
Console.WriteLine(1 / d); // compiles, runs, results in: Infinity
我可以理解编译器会在运行时主动检查除以零常量和 DivideByZeroException,但是:
为什么在被零除中使用双精度数会返回 Infinity 而不是抛出异常?这是设计使然还是错误?
只是为了好玩,我在 VB.NET 中也这样做了,结果“更一致”:
dim d as double = 0.0
Console.WriteLine(1 / d) ' compiles, runs, results in: Infinity
dim i as Integer = 0
Console.WriteLine(1 / i) ' compiles, runs, results in: Infinity
Console.WriteLine(1 / 0) ' compiles, runs, results in: Infinity
编辑:
根据 kekekela 的反馈,我运行了以下结果:
Console.WriteLine(1 / .0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);
这个测试似乎证实了这个想法,0.0 的字面双倍实际上是一个非常非常小的分数,它将导致无穷大......
【问题讨论】:
-
这是我关于这个主题的文章:blogs.msdn.com/b/ericlippert/archive/2009/10/15/…
标签: c# .net vb.net .net-3.5 divide-by-zero