【问题标题】:The sub-specifier in printfprintf 中的子说明符
【发布时间】:2014-01-07 01:06:30
【问题描述】:
int main ()
{
    float Num = 3254.4;
    printf("%06.4f",Num);
    return 0;
}

为什么它没有像我预期的那样打印003254.3999,而是3254.3999?

I've completely read this reference 发帖前。

【问题讨论】:

    标签: c printf mingw32


    【解决方案1】:

    来自您的参考:

    宽度:

    要打印的最少字符数。如果要打印的值比这个数字短,结果用空格填充。即使结果更大,该值也不会被截断。

    请注意,这会计算所有字符,包括 .和四位小数

    向左 6 + 向右 4 + 小数点 1 = 11 (不是 10)

    你想要的是“%011.4f”

    对此进行了测试:

    printf("%011.4f\n", 1.4);
    

    结果是:

    000001.4000  // note 6 to the left and 4 to the right (plus the .) = 11
    

    【讨论】:

    • OP 认为 '6' 仅适用于 '.' 左侧的内容。他不一定希望用两个'0's 填充它。
    • @BitFiddlingCodeMonkey 从他的问题中他想要“003254.3999”不是用 00 填充吗?
    • 他没有具体说明他想要什么。不过,这只是语义。干得好。
    【解决方案2】:

    将6 更改为10 或更大,您将看到0 填充。您指定的 6 是它将打印的最少字符。您的号码 (3254.3999) 有九个。

    【讨论】:

    • 是的,对此进行了测试:printf("%011.4f\n", 1.2344); 结果是000001.2344 .
    【解决方案3】:

    试试这个:

    int main ()
    {
        float Num = 3254.4;
        printf("%011.4f",Num);
        return 0;
    }
    

    即,尝试将说明符值更改为大于 6,因为您指定了最小字符数限制。

    【讨论】:

    • 需要0前面的10:printf("%010.4f",Num);
    • 6+4+1 = 11 而不是 10 -- 左边 6 + 右边 4 + 1 表示十进制
    【解决方案4】:

    这是因为6 用于将输出右对齐到 6 个位置。由于输出的宽度为 9 位,因此效果不可见。如果增加宽度,则可以看到效果。

    【讨论】:

    • 实际输出宽度为9。
    • @BitFiddlingCodeMonkey;修好了。
    猜你喜欢
    • 2017-11-16
    • 2011-05-23
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多