为什么相同的值与float和double不同

时间:2013-11-18 14:06:21

标签: c#

考虑这个程序

float a = 0.7f;

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

输出为Less。为什么?

2 个答案:

答案 0 :(得分:10)

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

恰好0.7的最近代表是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) < 1E-8)

答案 1 :(得分:6)

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

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
}