考虑这个程序
float a = 0.7f;
if (a < 0.7)
{
Console.WriteLine("Less");
}
输出为Less
。为什么?
答案 0 :(得分:10)
由于0.7
没有float
或double
的精确表示:它不是2的负幂的精确总和。
恰好0.7
的最近代表是float
约为0.69999998807907104492
,而最接近的double
代表是0.69999999999999995559
。正如您所看到的,double
略高,这解释了您的程序的行为。
这是一个小型演示,您可以运行以查看系统上的值:
printf("%20.20f %20.20f\n", 0.7, (float)0.7);
这里的外卖课程是,您不应期望数学上相等数字的double
和float
表示正确地比较相等性。只有一小部分小数可以在浮点系统中表示为精确数字。
由于绝大多数分数都是近似的,因此最好与某种程度的容差进行比较。例如,您应该编写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
}