宽度小于printf()的精度是多少?

时间:2011-07-07 20:38:39

标签: c++ formatting printf

我遇到了一些代码如下的代码:

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<

在第一种情况下,精度小于指定的宽度,实际上添加了前导空格。但是,当精度更高时,宽度似乎是多余的。

这样的格式是否有原因?

3 个答案:

答案 0 :(得分:4)

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

Here's来自MSDN的文章;最后一句解释了它。

  

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

答案 1 :(得分:2)

也许是程序员的错误?也许他们交换了%8.4f或他们实际打算%12.8f甚至%012.8f

See codepad sample

#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位小数。

对于您的特定行:在这种特殊情况下,我觉得您有关宽度说明符的冗余。