c - 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 要求。在我的情况下,调试器匹配打印
解决方案
浮点数最多只能精确到 7 个有效数字。不是 7位十进制数字。80.123456F 有 8 个有效数字,所以这是行不通的。
虽然 80.12345 只有 7 个有效数字,但它实际上最终在 80.1234512329101562 左右。哪一个,只要您不尝试打印比它更多的数字,就可以了。不幸的是,%f 总是在小数点后打印 6 位数字。在这种情况下,这不仅仅是有意义的。使用 %g 会稍微好一些,您可以在其中指定有效数字的数量。