我遇到了一些代码如下的代码:
fprintf(fd, "%4.8f", ptr->myFlt);
最近没有使用C ++,我阅读了关于printf及其同类的文档,并了解到在这种情况下4是“宽度”,8是“精度”。宽度定义为输出占用的最小空间数,如果需要,填充带前导空格。
既然如此,我无法理解像“%4.8f”那样的模板是什么意思, 因为该点之后的8(必要时填零)小数点已经确保满足并超过了4的宽度。所以,我用Visual C ++编写了一个小程序:
// Formatting width test
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
printf("Need width when decimals are smaller: >%4.1f<\n", 3.4567);
printf("Seems unnecessary when decimals are greater: >%4.8f<\n", 3.4567);
printf("Doesn't matter if argument has no decimal places: >%4.8f<\n", (float)3);
return 0;
}
给出以下输出:
Need width when decimals are smaller: > 3.5<
Seems unnecessary when decimals are greater: >3.45670000<
Doesn't matter if argument has no decimal places: >3.00000000<
在第一种情况下,精度小于指定的宽度,实际上添加了前导空格。但是,当精度更高时,宽度似乎是多余的。
这样的格式是否有原因?
答案 0 :(得分:4)
如果打印数字的总宽度小于指定的宽度,则宽度格式说明符仅影响输出。显然,当精度设置为大于或等于宽度时,这种情况永远不会发生。因此,在这种情况下宽度规格是无用的。
Here's来自MSDN的文章;最后一句解释了它。
不存在或小的字段宽度不会导致字段截断;如果转换结果宽于字段宽度,则字段将展开以包含转换结果。
答案 1 :(得分:2)
也许是程序员的错误?也许他们交换了%8.4f
或他们实际打算%12.8f
甚至%012.8f
#include <stdio.h>
int main()
{
printf("Seems unnecessary when decimals are greater: >%4.8f<\n", 3.4567);
printf("Seems unnecessary when decimals are greater: >%8.4f<\n", 3.4567);
printf("Seems unnecessary when decimals are greater: >%12.4f<\n", 3.4567);
printf("Seems unnecessary when decimals are greater: >%012.4f<\n", 3.4567);
return 0;
}
输出
Seems unnecessary when decimals are greater: >3.45670000<
Seems unnecessary when decimals are greater: > 3.4567<
Seems unnecessary when decimals are greater: > 3.4567<
Seems unnecessary when decimals are greater: >0000003.4567<
答案 2 :(得分:0)
可能只是一个猜测,但是: 如果你有更多的小数,精度给小数一个不会超过的长度。 同样,宽度可以防止您的数量占用的空间少于应有的空间。 如果你想到某种带数字的表,你只能在每行上的每一列具有相同的宽度时获得统一的列,而不管它包含的数字。
因此,在某些价格中需要精确度,例如10.00€格式,你总是想要2位小数。
对于您的特定行:在这种特殊情况下,我觉得您有关宽度说明符的冗余。