【问题标题】:Why same values differ with float and double [duplicate]为什么相同的值与 float 和 double 不同 [重复]
【发布时间】:2013-12-01 17:15:58
【问题描述】:

考虑这个程序

float a = 0.7f;

if (a < 0.7)
{
    Console.WriteLine("Less");
}

输出为Less。为什么??

【问题讨论】:

标签: c#


【解决方案1】:

因为0.7 没有floatdouble 的精确表示:它不是2 的负幂的精确总和。

碰巧0.7 作为 a 的最接近的表示是 float,大约是 0.69999998807907104492,而最接近的 double 表示是 0.69999999999999995559。如您所见,double 稍大一些,这解释了您的程序的行为。

这是一个小演示,您可以运行它来查看系统上的值:

printf("%20.20f %20.20f\n", 0.7, (float)0.7);

(live demo on ideone).

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

由于绝大多数分数都是近似的,因此最好在一定程度的容差下进行比较。例如,不要写if (a == 0.7),而应该写if (abs(a - 0.7) &lt; 1E-8)

【讨论】:

    【解决方案2】:

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

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2016-12-18
      • 1970-01-01
      • 2019-08-05
      • 2013-03-22
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多