C中的%0.f和%.f之间是否存在差异?

时间:2018-05-15 22:49:13

标签: c

我正在尝试将浮点数打印到无小数位,我使用了%0.f和%.f,它们给了我相同的结果。它们之间有区别吗?

4 个答案:

答案 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.f0左侧侧的.字面意思是用空格填充数字,直到数字为{至少0列宽。但由于没有负宽度数字字符串这样的东西,它实际上永远不会写任何空格填充,所以它只相当于%.f

相关问题