为什么 dpes 此代码打印“False”?为什么不打印“True”?[复制]

Why dpes this code print "False"? Why doesn't it print "True"? [duplicate]

提问人:محمود خالد 提问时间:3/7/2023 最后编辑:Jonathan Lefflerمحمود خالد 更新时间:3/7/2023 访问量:70

问:

当我运行此代码时,它会打印 .我不清楚False

#include <stdio.h>
    int main()
    {
        float f = 0.1;
        if (f == 0.1)
            printf("True");
        else
            printf("False");
    }

我希望这段代码打印出来,而不是TrueFalse

c 浮点 精度

评论

0赞 erik258 3/7/2023
一般来说,你应该使用不doublefloat
2赞 Weather Vane 3/7/2023
请注意,不能用 a 或变量精确表示。但是,如果您坚持使用相同的浮点类型,则这些不精确的值可能会相等。我的编译器警告我该值被截断为 .0.1floatdoubledouble0.1float
2赞 Keith Thompson 3/7/2023
通常,最接近的可表示值是 ,而最接近的值是 。这些是您正在比较的值。float0.10.100000001490116119384765625double0.1000000000000000055511151231257827021181583404541015625

答:

5赞 Eric Postpischil 3/7/2023 #1

0.1是一个常数。在 中,该值隐式转换为 。和 类型具有不同的精度,因此转换会产生较小的舍入误差。因此,存储在 中的值不等于 的值。doublefloat f = 0.1;doublefloatfloatdoublefloatfdouble0.1

如果在出现的两个位置都更改为“True”,程序将打印“True”。0.10.1f

评论

0赞 محمود خالد 3/7/2023
非常感谢您的有用回答。但是,你能向我解释一下背后的语义吗?0.1f
0赞 Andreas Wenzel 3/7/2023
@محمودخالد:我建议你阅读浮点常量中的后缀。后缀仅表示浮点常量是 type 而不是 。ffloatdouble