代码之家  ›  专栏  ›  技术社区  ›  Jronny

为什么一个浮点数除以一个较大的浮点数会得到零,我如何才能在c中避免这个问题?

  •  1
  • Jronny  · 技术社区  · 16 年前

    我试图分裂 (float)200 / (float)500 但结果是0.0。为什么会这样?我们怎么能得到0.4?谢谢。

    4 回复  |  直到 13 年前
        1
  •  3
  •   Hans Passant    16 年前

    这是一个很常见的错误,每个程序员至少会犯一次。有 一种除法运算符,它们都使用相同的符号、积分和浮点。编译器根据操作数的类型选择它使用的类型。如果 二者都 左边和右边的操作数是积分的,然后你会得到一个积分除法。机器代码中的IDIV指令。它截断为零并产生一个积分结果。

    至少尽快 操作数是浮点,您将得到机器代码中的fdiv指令和您要查找的结果。就像你在问题中所做的那样,简单地投(浮)或(双)就足够了。你只需要铸造其中一个。或者使用像200f或200.0这样的浮点文字

        2
  •  2
  •   Andreas Bonini    16 年前

    那是不可能的。我可以想到以下场景:

    1. 您正在将结果强制转换为一个整数;在这种情况下,它将被四舍五入为0
    2. 200和500不是真正的浮点数,而是整数;结果将默认为整数。
    3. 打印浮点的方式要么将其转换为整数,要么不显示十进制值。
        3
  •  2
  •   Andy Shellam    16 年前

    没什么问题-我和安德烈亚斯在一起。

        Console.WriteLine((float)200 / (float)500);
    
        Console.WriteLine("Press any key to continue");
        Console.ReadKey(true);
    

    结果:

    零点四

    按任意键继续

        4
  •  0
  •   Konstantin Salavatov    13 年前

    我在使用Unity3D项目的MonoDevelopDebugger中遇到了这个问题。不知何故,评估窗口显示1.0f/10.0f=0长。这只是单显影IDE的一个缺陷。