printf()中宽度小于精度的意义是什么?

8

我发现一段代码有一行看起来像这样:

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<

在第一种情况下,精度小于指定的宽度,实际上会添加前导空格。然而,当精度更大时,宽度似乎是多余的。 这样格式化的原因是什么?

2
不,没有理由。如果我需要这样的东西,我会使用“%0.8f”来表明我不关心小数点左边有多少位数字。 - Mark Ransom
1
我敢打赌原始程序员的意图是指定输出格式为 1234.87654321。如果我在发明 printf() 的时候,我可能会这样做(并想出其他字符来处理非浮点格式的总体宽度和精度)。 - Michael Burr
你为什么标记为 c++ 而不是 c - leftaroundabout
如果你正在使用C++编写代码,并且用C++编译器进行编译,那么它就是C++。C语言恰好也使用printf函数并不相关。 - Puppy
3个回答

5

如果打印的数字总宽度小于指定的宽度,则宽度格式说明符仅影响输出。当精度大于或等于宽度时,显然永远不会发生这种情况。因此,在这种情况下,宽度规范是无用的。

这里有一篇来自MSDN的文章,最后一句话解释了这个问题。

不存在或较小的字段宽度不会导致字段截断;如果转换的结果比字段宽度宽,则该字段会扩展以包含转换结果。


2
也许是程序员的错误?也许他们交换了%8.4f,或者他们实际上想要%12.8f甚至是%012.8f查看codepad示例:
#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<

0
可能只是猜测,但是: 精度给小数点一个长度,如果你有更多的小数位,它不会超过这个长度。 同样,宽度可以防止你的数字占用比它应该少的空间。 如果你想到一种带有数字的表格,只有当每行的每列具有相同的宽度时,才能实现统一的列。
因此,在某些价格格式(如10.00欧元)中需要精度,其中你总是想要2个小数位。
对于你特定的行:我觉得在这种特殊情况下,宽度指示符是多余的。

但是4的宽度适用于整个输出(小数点之前和之后)。该输出不可能比10更窄,包括小数点和前导数字。由于精度为8,即使是0也将是“0.00000000”。 - Buggieboy
正如我之前所述,在这种情况下似乎没有任何影响。也许格式经常被更改了... - Nobody moving away from SE

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