Python 为什么在这两种情况下,比较浮动时的输出不同

Python 为什么在这两种情况下,比较浮动时的输出不同,python,c,floating-point,precision,equality,Python,C,Floating Point,Precision,Equality,PYTHON程序: a = 0.2 if a == 0.2: print('*') * #include <stdio.h> int main(void) { float a = 0.2; if(a == 0.2) { puts("*"); } } 输出: a = 0.2 if a == 0.2: print('*') * #include <stdio.h> int main(void)

PYTHON程序

a = 0.2
if a == 0.2:
    print('*')
*
#include <stdio.h>

int main(void) 
{
    float a = 0.2;
    if(a == 0.2)
    {
        puts("*");
    }
}

输出

a = 0.2
if a == 0.2:
    print('*')
*
#include <stdio.h>

int main(void) 
{
    float a = 0.2;
    if(a == 0.2)
    {
        puts("*");
    }
}

C程序

a = 0.2
if a == 0.2:
    print('*')
*
#include <stdio.h>

int main(void) 
{
    float a = 0.2;
    if(a == 0.2)
    {
        puts("*");
    }
}


为什么两种情况下的输出不同?
=
运算符的工作方式是否有区别?

这是因为float和double类型为尾数保留了不同的宽度。double类型可以更精确地表示浮点数。在这种情况下,重要的是0.2不能精确表示,当存储为double和float时,它的表示形式略有不同

在这种情况下

if(a == 0.2)
左操作数的类型为float,而右操作数的类型为double,因为C中带“.”的数字文字的默认类型为double

因此,按照以下方式更改声明

double a = 0.2;
或者改变条件,如

if(a == 0.2f)
这是一个演示程序

#include <stdio.h>

int main(void) 
{
    float a1 = 0.2;

    if ( a1 == 0.2f )
    {
        puts( "*" );
    }

    double a2 = 0.2;

    if ( a2 == 0.2 )
    {
        puts( "*" );
    }
}

这是因为float和double类型为尾数保留了不同的宽度。double类型可以更精确地表示浮点数。在这种情况下,重要的是0.2不能精确表示,当存储为double和float时,它的表示形式略有不同

在这种情况下

if(a == 0.2)
左操作数的类型为float,而右操作数的类型为double,因为C中带“.”的数字文字的默认类型为double

因此,按照以下方式更改声明

double a = 0.2;
或者改变条件,如

if(a == 0.2f)
这是一个演示程序

#include <stdio.h>

int main(void) 
{
    float a1 = 0.2;

    if ( a1 == 0.2f )
    {
        puts( "*" );
    }

    double a2 = 0.2;

    if ( a2 == 0.2 )
    {
        puts( "*" );
    }
}

在C中的
a==0.2
中,0.2是双精度,而a是浮点。如果(a==0.2f){..},则将其更改为
。如果这样做有效/改变了行为,请搜索“浮点数学是否已损坏?”。简短总结:永远不要使用浮点值进行“精确比较”。总是使用ε。而且,在语义不同的不同语言之间进行直接比较往往很困难。即使是在语法可能相同的小范围内,行为也可能大不相同。Alse@NSR No即使在Python中也不可靠。假设您已经创建了两个不同的函数,它们接受不同的输入并对输入进行一些计算。使用一组特定的输入应该在数学上产生完全相等的结果,但由于表示不准确和可能的复合舍入误差,这两个结果并不完全相等,只是非常接近。在C中的
a==0.2
中,0.2是双精度,而a是浮点。如果(a==0.2f){..}
,则将其更改为
。如果这样做有效/改变了行为,请搜索“浮点数学是否已损坏?”。简短总结:永远不要使用浮点值进行“精确比较”。总是使用ε。而且,在语义不同的不同语言之间进行直接比较往往很困难。即使是在语法可能相同的小范围内,行为也可能大不相同。Alse@NSR No即使在Python中也不可靠。假设您已经创建了两个不同的函数,它们接受不同的输入并对输入进行一些计算。使用一组特定的输入应该在数学上产生完全相等的结果,但由于表示不准确和可能的复合舍入误差,这两个结果并不完全相等,只是非常接近。