为什么相同的值会因float和double而有所不同
这个问题在这里已经有了答案:
因为0.7
不具有精确表示作为float
或double
:它不是2负功率的精确总和。
它发生0.7
最接近的表示为a float
大约0.69999998807907104492
,而最接近的double
表示是0.69999999999999995559
。 正如你所看到的, double
稍大一些,这就解释了你的程序的行为。
下面是一个小程序,您可以运行它来查看系统上的值:
printf("%20.20f %20.20fn", 0.7, (float)0.7);
(现场演示ideone)。
这里的重要教训是,你不应该期望数学上相等的数字的double
和float
表示来正确地进行比较。 只有一小部分小数可以在浮点系统中表示为精确数字。
由于绝大多数分数是近似的,因此以一定的容差水平进行比较是一个好主意。 例如, 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