为什么在两种情况下比较浮点数的输出不同

Why is the output different in both cases comparing floats

提问人: 提问时间:6/16/2020 最后编辑:Torxed 更新时间:6/16/2020 访问量:82

问:

PYTHON程序

a = 0.2
if a == 0.2:
    print('*')

输出

*

C程序

#include <stdio.h>

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

输出


为什么两种情况下的输出不同?操作员的工作有区别吗?==

Python C 浮点 精度 相等

评论

6赞 user2864740 6/16/2020
在 C 中,0.2 是双精度,而 a 是浮点数。将其更改为 .如果这有效/改变了行为,请搜索“浮点数学坏了吗?a == 0.2if(a == 0.2f) { .. }
3赞 Some programmer dude 6/16/2020
非常相关的问题。简短总结:永远不要使用浮点值进行“精确比较”。始终使用 epsilon
2赞 Some programmer dude 6/16/2020
此外,通常很难在具有不同语义的不同语言之间进行直接比较。即使对于语法看起来相同的小而有限的区域,行为也可能大不相同。
0赞 Weather Vane 6/16/2020
Alse 为什么浮点数不准确?
1赞 Some programmer dude 6/16/2020
@NSR 不,即使在 Python 中也不可靠。假设您创建了两个不同的函数,它们接受不同的输入,并对输入进行一些计算。使用一组特定的输入在数学上应该产生完全相等的结果,但由于表示不准确和可能的复合舍入误差,这两个结果并不完全相等,只是非常接近。

答:

3赞 Vlad from Moscow 6/16/2020 #1

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

在条件

if(a == 0.2)

左操作数的类型为 float,而右操作数的类型为 double,因为 C 中带有“.”的数字文字的默认类型是双精度值。

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

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( "*" );
    }
}

它的输出是

*
*