我正在尝试将浮点数打印到无小数位,我使用了%0.f和%.f,它们给了我相同的结果。它们之间有区别吗?
答案 0 :(得分:3)
是的,它们是一样的。
小数点左边的数字是用空格填充之前要打印的最小位数。
如果该数字以零开头,则还表示该数字应填充零而不是空格。如果长度为零,则不会应用填充。打印长度小于零的数字是不可能的,因此永远不会使用额外的填充指示符。
在任何一种情况下,都必须打印一些数字,这意味着即使您指示您想要一个最小零长度浮点数,它也会打印超过最小长度以显示数字的值。对于您的测试用例,printf("%0.f", 0.0f)
的输出将显示0
,决定打印超过最小字符数以显示该数字。
对于那些让%0.f
与%.0f
混淆的人,请注意一个指定最小位数,另一个是精确修饰符。
对于浮点数,.
字符的存在表示指定的精度,右边没有数字则表示为0
。因此%3.0f
和%3.f
是等效的。如果你没有在你的浮点数中提供.
,那么假设你的浮点数被有效地格式化为.6
答案 1 :(得分:0)
没有。他们不一样。如果float在小数点后没有任何数字,则输出看起来相同。当小数点后面有数字时,取决于编译器%.0f将截断,舍入,下限或ceil删除它们。 %.f显示提供的任何数字,直到编译器指定的最大值。通常~6位数。它通常根据浮点数和相应的位数设置为合理的。
答案 2 :(得分:0)
关于浮动的fprintf的C99 Ansi Standard部分7.19.6.10:
在任何情况下,不存在或小的字段宽度都不会导致字段截断;如果转换结果宽于字段宽度,则字段将展开以包含转换结果。
因此,如果您的数字需要一个小数,那么无论您编写'%.f'还是'%0.f',结果都可能是相同的,并且它不会像预期的那样将其切断。
答案 3 :(得分:0)
printf
的 %M.Nf
格式代码,其中M和N是整数,意味着将数字四舍五入到N个小数位,并用空格左边填充它直到它占用至少M个屏幕栏。
>>> printf('%10.2f', 12345.6789);
12345.68
^^ Note the 2 spaces here to produce 10 chars of output.
这里的关键词是“至少”。如果“自然”数字占用超过M列,则不会被截断。
%0.f
(0
上左侧侧的.
字面意思是用空格填充数字,直到数字为{至少0列宽。但由于没有负宽度数字字符串这样的东西,它实际上永远不会写任何空格填充,所以它只相当于%.f
。