按照设计,为什么 C# 编译器允许任何浮点或双精度值除以零?
class Program
{
static void Main(string[] args)
{
double x = 0.0 / 0;
float y = 1f / 0;
}
}
因为 IEEE 754 浮点值有特殊的非数字值来处理这个问题:
PS Home:\> 1.0/0
Infinity
PS Home:\> 0.0/0
NaN
而整数除以零始终是异常(在 C# 意义上1),因此您可以直接抛出异常。
1 将浮点数除以零也是一个例外,但处于完全不同的级别,并且许多编程语言将其抽象化。
因为浮点值具有无穷大的有效(并且真正有用)表示,而任何类型的整数都没有。
编译器允许您将 float 或 double 除以零的原因是 float 和 double 具有正无穷大和负无穷大(以及“不是数字”)概念的表示,因此允许它是有意义的事情.
一个奇怪的地方是编译器失败了
decimal d = 2;
decimal d2 = d/0M
作为除以零,尽管如果您为整数编写等效代码,它确实会发现它。