为什么一个浮点除以一个更大的浮点会得到零,在C#中如何避免这种情况?

为什么一个浮点除以一个更大的浮点会得到零,在C#中如何避免这种情况?,c#,.net,floating-point,division,C#,.net,Floating Point,Division,我试图除以(float)200/(float)500,但结果是0.0。为什么会这样?我们怎么能得到0.4?非常感谢。那是不可能的。我可以想到以下情况: 您正在将结果强制转换为整数;在这种情况下,它将四舍五入到0 200和500不是真正的浮点数,而是整数;默认情况下,结果将是一个整数 打印浮点的方式将其转换为整数或不显示十进制值 那是不可能的。我可以想到以下情况: 您正在将结果强制转换为整数;在这种情况下,它将四舍五入到0 200和500不是真正的浮点数,而是整数;默认情况下,结果将是一个整数 打

我试图除以
(float)200/(float)500
,但结果是0.0。为什么会这样?我们怎么能得到0.4?非常感谢。

那是不可能的。我可以想到以下情况:

  • 您正在将结果强制转换为整数;在这种情况下,它将四舍五入到0
  • 200和500不是真正的浮点数,而是整数;默认情况下,结果将是一个整数
  • 打印浮点的方式将其转换为整数或不显示十进制值

  • 那是不可能的。我可以想到以下情况:

  • 您正在将结果强制转换为整数;在这种情况下,它将四舍五入到0
  • 200和500不是真正的浮点数,而是整数;默认情况下,结果将是一个整数
  • 打印浮点的方式将其转换为整数或不显示十进制值

  • 这里没什么问题,我和安德烈亚斯在一起

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

    0.4

    按任意键继续


    这里没什么问题,我和安德烈亚斯在一起

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

    0.4

    按任意键继续


    这是一个非常常见的错误,每个程序员至少犯一次。有两种除法运算符,它们都使用相同的符号:整数和浮点。编译器根据操作数的类型选择它使用的操作数。如果左操作数和右操作数都是整数,则得到整数除法。机器代码中的idiv指令。它将截断为零并生成一个积分结果


    只要至少有一个操作数是浮点,您就会得到机器代码中的fdiv指令以及您要查找的结果。就像你在问题中所做的那样,简单地将其转换为(浮动)或(双重)就足够了。你只需要投其中一个。或者使用像200f或200.0这样的浮点文字。这是一个非常常见的错误,每个程序员至少会犯一次。有两种除法运算符,它们都使用相同的符号:整数和浮点。编译器根据操作数的类型选择它使用的操作数。如果左操作数和右操作数都是整数,则得到整数除法。机器代码中的idiv指令。它将截断为零并生成一个积分结果


    只要至少有一个操作数是浮点,您就会得到机器代码中的fdiv指令以及您要查找的结果。就像你在问题中所做的那样,简单地将其转换为(浮动)或(双重)就足够了。你只需要投其中一个。或者使用像200f或200.0之类的浮点文字,我在Unity3D项目的MonoDevelop调试器中遇到了这个问题。不知何故,评估窗口显示1.0f/10.0f=0长。这只是MonoDevelop IDE的一个bug。

    我在Unity3D项目的MonoDevelop调试器中遇到了这个问题。不知何故,评估窗口显示1.0f/10.0f=0长。这只是MonoDevelop IDE的一个bug。

    好吧,在我的机器上
    200f/500f==0.4f
    。您如何显示计算结果?您不会将其保存为
    int
    类型的变量?很可能您的代码正在以某种方式执行键入或转换错误。你能发布你的代码让我们检查明显的错误吗?我知道这是不可能的,但它确实做到了。我试着再次运行这个程序,效果很好。很抱歉浪费了你们的时间,伙计们。非常感谢。在我的机器上
    200f/500f==0.4f
    。您如何显示计算结果?您不会将其保存为
    int
    类型的变量?很可能您的代码正在以某种方式执行键入或转换错误。你能发布你的代码让我们检查明显的错误吗?我知道这是不可能的,但它确实做到了。我试着再次运行这个程序,效果很好。很抱歉浪费了你们的时间,伙计们。谢谢。