C# 为什么相同的值与float和double不同
以这个项目为例C# 为什么相同的值与float和double不同,c#,C#,以这个项目为例 float a = 0.7f; if (a < 0.7) { Console.WriteLine("Less"); } float a=0.7f; 如果(a
float a = 0.7f;
if (a < 0.7)
{
Console.WriteLine("Less");
}
float a=0.7f;
如果(a<0.7)
{
控制台。写入线(“更少”);
}
输出小于。为什么???因为
0.7
没有一个精确的表示法,即浮点值或双倍值:它不是2的负幂的精确和
恰好0.7
最接近的表示形式是float
大约0.6999998807907104492
,而最接近的双
表示形式是0.69999999999995559
。如您所见,double
稍大一些,这解释了程序的行为
下面是一个小演示,您可以运行它来查看系统上的值:
printf("%20.20f %20.20f\n", 0.7, (float)0.7);
()
这里的要点是,您不应该期望数学上相等的数字的double
和float
表示能够正确地进行相等比较。在浮点系统中,只有小数的一小部分可以表示为精确数
由于绝大多数分数都是近似值,因此最好使用一定程度的公差进行比较。例如,如果(a==0.7)
您应该编写if(abs(a-0.7)<1E-8)
而不是编写if(a==0.7)
您在不知不觉中比较了代码中的苹果和土豆
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;//“0.7f”是一个浮点数
如果(a<0.7)/“0.7”是双精度
{
Console.WriteLine(“Less”);//您将看到它,因为它的表示方式不同
}
如果您符合以下号码类型,您的支票将按预期工作:
float a = 0.7f;
if(a < 0.7f)
{
Console.WriteLine("Less"); // You won't see this
}
float a=0.7f;
如果(a<0.7f)
{
Console.WriteLine(“Less”);//您不会看到这个
}
这就是数字永远不应该硬编码的原因。修复代码的最佳方法:
float check = 0.7f;
float a = 0.7f;
if(a < check)
{
Console.WriteLine("Less"); // You won't see this either
}
float check=0.7f;
浮子a=0.7f;
如果(a<检查)
{
Console.WriteLine(“Less”);//您也不会看到这个
}
看一看:解释很长。您应该阅读:基本解释:完整解释:可能是因为二进制浮点表示法不能准确地表示像0.7这样的十进制数,但不确定为什么要向下投票。不会认为这是个坏问题。只是一个副本。。。