首页 > 解决方案 > C float 初始化结果出乎意料

问题描述

Visual Studio 2019 社区浮点变量不是我将其初始化为的。为了避免截断,我降低了精度。这不是“可控”的吗?

试图以其他方式强制初始化

int main()
{
    // where did my 6 go?
    float b = 80.123456F;
    printf("b:[%f]\n", b);

    // rounds up
    float c = 80.1234569F;
    printf("c:[%f]\n", c);

    // rounds up
    float d = 80.1234561F;
    printf("d:[%f]\n", d);


    // appends a 1
    float e = 80.12345F;
    printf("e:[%f]\n", e);

    // prints what's initialized
    float f = 80.123451F;
    printf("f:[%f]\n", f);

    // prints what's initialized
    float g = 80.123459F;
    printf("g:[%f]\n", g);
}
b:[80.123459]
c:[80.123459]
d:[80.123459]
e:[80.123451]
f:[80.123451]
g:[80.123459]

我从调试器开始并写了这个来满足 SO 要求。在我的情况下,调试器匹配打印

标签: cfloating-pointinitialization

解决方案


浮点数最多只能精确到 7 个有效数字。不是 7位十进制数字。80.123456F 有 8 个有效数字,所以这是行不通的。

虽然 80.12345 只有 7 个有效数字,但它实际上最终在 80.1234512329101562 左右。哪一个,只要您不尝试打印比它更多的数字,就可以了。不幸的是,%f 总是在小数点后打印 6 位数字。在这种情况下,这不仅仅是有意义的。使用 %g 会稍微好一些,您可以在其中指定有效数字的数量。


推荐阅读