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这样的十进制数,但不确定为什么要向下投票。不会认为这是个坏问题。只是一个副本。。。