为什么相同的值会因float和double而有所不同

这个问题在这里已经有了答案:

  • .NET中decimal,float和double的区别? 17个答案

  • 因为0.7不具有精确表示作为floatdouble :它不是2负功率的精确总和。

    它发生0.7最接近的表示为a float大约0.69999998807907104492 ,而最接近的double表示是0.69999999999999995559 。 正如你所看到的, double稍大一些,这就解释了你的程序的行为。

    下面是一个小程序,您可以运行它来查看系统上的值:

    printf("%20.20f %20.20fn", 0.7, (float)0.7);
    

    (现场演示ideone)。

    这里的重要教训是,你不应该期望数学上相等的数字的doublefloat表示来正确地进行比较。 只有一小部分小数可以在浮点系统中表示为精确数字。

    由于绝大多数分数是近似的,因此以一定的容差水平进行比较是一个好主意。 例如, if (abs(a - 0.7) < 1E-8)代替写if (a == 0.7) if (abs(a - 0.7) < 1E-8)


    你不知不觉在你的代码中比较苹果和土豆。

    float a = 0.7f; // "0.7f" is a float
    if(a< 0 .7)     // "0.7" is a double
    {
        Console.WriteLine("Less"); //You'll see it because of different representations
    }
    

    如果您匹配数字类型,您的支票将按照您的预期工作:

    float a = 0.7f;
    if(a < 0.7f)
    {
        Console.WriteLine("Less"); // You won't see this
    }
    

    就是为什么数字不应该被硬编码的原因。 解决您的代码的最佳方法是:

    float check = 0.7f;
    float a = 0.7f;
    if(a < check)
    { 
        Console.WriteLine("Less"); // You won't see this either
    }
    
    链接地址: http://www.djcxy.com/p/21339.html

    上一篇: Why same values differ with float and double

    下一篇: Float, Double and Decimal Max Value vs Size