Typecasting int to float将DivideByZeroException转换为Infinity

时间:2011-10-17 13:19:04

标签: c# floating-point-precision divide-by-zero

我在C#中写了一个简单的divide函数:

    private string divide(int a, int b)
    {
        return string.Format("Result: {0}", a / b);
    }

如您所料,调用MessageBox.Show(divide(3, 0))会产生DivideByZeroException

所以我决定将a强制转换为浮点数(以获得非整数的返回值),如下所示:

    private string divide(int a, int b)
    {
        return string.Format("Result: {0}", (float)a / b);
    }

奇怪的是,这现在向我显示结果:无限

这对我来说似乎是个错误,虽然我可能会弄错。是因为结果现在是一个浮点数,它被视为3 / 1 x 10^-99999或类似的返回值?

我对这个结果感到非常惊讶。

3 个答案:

答案 0 :(得分:3)

这是将int转换为float时的行为。这取自MSDN文档:

  

将浮点值除以零将导致为正   根据无穷大,负无穷大或非数字(NaN)   IEEE 754算法规则。浮点运算永远不会抛出   例外。有关详情,请参阅SingleDouble

答案 1 :(得分:2)

来自算术溢出部分下的MSDN

  

浮点算术溢出或除零从不抛出   异常,因为浮点类型基于IEEE 754等   有代表无限和NaN(非数字)的规定。

答案 2 :(得分:1)

不,对于正确的浮动操作。

  

几乎所有现代浮点单元都支持的IEEE浮点标准规定每个浮点算术运算(包括除以零)都有明确定义的结果。该标准支持有符号零,以及无穷大和NaN(不是数字)。有两个零,+ 0(正零)和-0(负零),这消除了分割时的任何歧义。在IEEE 754算术中,当a为正时,÷+ 0为正无穷大,当a为负时,÷+ 0为负无穷大,当a =±0时,为NaN。除以-0时,无穷大符号会发生变化。

     

Reference