C语言:打印浮点数值

117
我想打印一个浮点数,它有两个整数位和小数点后六位。如果我只使用 printf("%f", myFloat) ,我会得到截断的值。
我不知道这是否总是在 C 中发生,还是只因为我在微控制器中使用 C(确切地说是 CCS),但参考资料表明,%f 只获取截断的浮点数。
如果我的浮点数是 44.556677,那么我只会输出其中的前两位小数 "44.55"
所以问题是... 我该如何打印出我的六位数字(只有这六位数字,以防万一后面跟着零或其他内容)?

6
如果您的运行时库支持,%2.6f听起来会是正确的格式字符串。 - Jon
2
如果你使用 float ,则无论如何都不会得到 8 个有意义的有效十进制数字。你现在要求的精度比数据类型所拥有的还要高。最接近 44.556677 的 float 值是 44.55667 87719 72656 25 - David Heffernan
现在是提出“浮点数不是真实的”(Floating Point Numbers Aren't Real)的适当时机:http://www.freshsources.com/FPNotReal.pdf - Kennet Belenky
@roman 对于单精度浮点数,大约有7个有效数字。 - David Heffernan
11
六年过去了,我想我会接受它的,伙计。 - Roman Rdgz
显示剩余2条评论
7个回答

212

你可以这样做:

printf("%.6f", myFloat);

6代表小数点后的位数。


谢谢!我想到了,但我只是觉得这不可能那么简单! - Roman Rdgz
9
“2”并不是指小数点前的数字位数,而是指最小总共字段宽度(该值已经大于2),所以在这里它没有起到任何作用。 - caf

34

printf("%9.6f", myFloat)指定了一个总共有9个字符的格式:小数点前有2位数字,小数点本身占1位,小数点后有6位数字。


4
%09.6f 也许也是一个选择。 - caf
2
@dasblinkenlight使用printf("%9.6f", myFloat),如果我在小数点前给出3个数字,它仍然会打印小数点前的3个数字。你能解释一下为什么吗? - xyz
其中一个网站https://www.codingunit.com/printf-format-specifiers-format-conversions-and-formatted-output解释了`%3.2f`的含义为(至少打印3位浮点数,精度为2)。 所以我现在有些困惑。 - xyz
在C语言的printf中,%N(其中N是一个数字)总是定义了字段完整输出的最小宽度。%6s总是打印至少6个字符(如果字符串更长,则打印更多)。较短的输出将被填充(在这种情况下,在左侧使用“-N”进行填充)。对于浮点数也没有例外。%3f至少打印3个字符,因此1.0输出为__1(两个前导空格显示为“_”),而1.1输出为1.1,不需要填充,它已经有3个字符。因此,在%N.Mf中,至少有N-M-1个字符的空间位于小数点之前。 - Tino

9
printf("%0k.yf" float_variable_name)

这里的k是你想要打印的字符总数。k = x + 1 + y+ 1代表小数点),float_variable_name是你想要打印的浮点变量名。

假设你想在小数点前打印x个数字,在小数点后打印y个数字。现在,如果浮点变量名前的数字数量小于x,则会自动在它之前加上相应数量的零。


8

4
注意!格式说明符 f 必须放在数字位数后面,所以应该写成 printf("%.numberf", myFloat)。谢谢提供有用的链接! - Niles

5

试试以下方法来澄清浮点数打印时的右对齐问题。

printf(" 4|%4.1lf\n", 8.9);
printf("04|%04.1lf\n", 8.9);

输出结果为:

 4| 8.9
04|08.9

2
使用%.6f。 这将打印六位小数。

0

在你的printf语句中,你需要使用%2.6f而不是%f


2
这是翻译后的文本:“这不是正确的。格式“%2.6f”表示小数点后有6个字符的总宽度为2个字符。” - Valeriy Van
1
@ValeriyVan 这有点像吹毛求疵,但我认为这很重要:这里的2并没有错,但它是非常多余的(甚至不是冗余),这通常告诉我们,作者对printf的工作原理感到困惑。%2.6f的意思是“小数点后面有6个数字,至少为2个字符宽”。由于我们总是会看到至少8个字符,因此2太低以至于在这里没有任何效果,需要将其设置为9或更高才能产生一些效果。请注意,我们这里不讨论数学:在%+9.6f中,仍然不需要9,因为%+.6f的宽度始终至少为9:符号、数字、小数点、6个数字。 - Tino
@Tino 我在想 %0.3f 会打印出总共 0 位数字 - 这也没有意义 :D - fahd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接