【问题标题】:string format for printf floating point valuesprintf 浮点值的字符串格式
【发布时间】:2011-10-30 15:31:55
【问题描述】:

我有一个关于使用 printf 的问题。

char str[8];
float val = 2.334563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = -23.34563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = -0.02334563;
sprintf(str, format, val);
printf("val = %s.\n", str);

val = 233;
sprintf(str, format, val);
printf("val = %s.\n", str);

预期输出如下:

val = +2.3345
val = -23.345
val = -0.0233
val = +233.00

我需要什么格式的字符串?感谢您的关注。

【问题讨论】:

    标签: c string printf string-formatting floating-point-conversion


    【解决方案1】:

    好老的%f怎么了

    【讨论】:

    • 没有得到想要的输出。他的问题应该更直接地问。
    • @JoeMcGrath:这个 Q 明显带有家庭作业的味道,我不喜欢为家庭作业问题编写任何形式的代码,除了提供指导或想法。 原因: 我不希望有一个程序员坐在我旁边(尽管从现在开始是几年后),他不会编写源代码给出提示。
    • 好的,谢谢。我是 Stack Overflow 的新手,并没有意识到。只是试图回答问题。我是一个没有上过学的业余程序员。没有想到家庭作业。以后会记得这样做。
    • @JoeMcGrath:是的,请。我理解您的热情和愿意提供帮助的意愿,但我们并不想将 SO 变成 Do My Homework 网站。通常,对于Q 有哪些家庭作业的味道 我们想看看 OP 已经尝试过什么,他们为解决问题所做的努力和想法。然后提供微妙的提示/线索,这将为他们指明方向并疏通他们,但也让他们有足够大的家庭作业去做. 作为一个业余程序员,你肯定知道,除了努力工作,别无选择。欢迎来到 SO,再见。一切顺利 :)
    【解决方案2】:
    "%f"
    

    例子

    printf("%f\n", floatVal);
    

    【讨论】:

    • 我需要固定大小的输出字符串。
    • "%f" 也不会在正数前面显示 + 号。
    【解决方案3】:

    以下(几乎)可以满足您的需求。请注意,我将str 数组中的字符数从 7 更改为 8;由于所有输出字符串都包含 7 个字符,sprintf 执行的 NULL 终止将导致缓冲区溢出。

    我的结果和你的结果之间的唯一区别是sprintf 执行的四舍五入。 AFAIK,解决此问题的唯一方法是使用 floor 预先截断要打印的数字;例如,打印 2 位不四舍五入 float f = floor( 1.8888 * 100 ) / 100;

    #include <stdio.h>
    
    int main(void)
    {
      char str[8];
    
      {
        float val = 2.334563f;
        sprintf(str, "%+6.*f", 4, val);
        printf("val = %s.\n", str);
      }
    
      {
        float val = -23.34563f;
        sprintf(str, "%+6.*f", 3, val);
        printf("val = %s.\n", str);
      }
    
      {
        float val = -0.02334563f;
        sprintf(str, "%+6.*f", 4, val);
        printf("val = %s.\n", str);
      }
    
      {
        float val = 233.0f;
        sprintf(str, "%+6.*f", 2, val);
        printf("val = %s.\n", str);
      }
    
      return 0;
    }
    

    输出:

    val = +2.3346.
    val = -23.346.
    val = -0.0233.
    val = +233.00.
    

    【讨论】:

    • 这需要在代码中手动计算所需的小数位数。在任何情况下使用代码执行此操作的方法是什么?
    【解决方案4】:

    使用 snprintf() 将字符串截断为 8 个字符,包括 \0

    格式字符串:

    "%#+.5f"
    
    %   modifier
    #   force decimal place
    +   show + or -
    .5  precision of 5
    f   use precision as places after decimal 
    

    代码:

    char str[8];
    float val = 2.334563;
    snprintf(str,8, "%#+.5f", val);
    printf("val = %s\n", str);
    
    val = -23.34563;
    snprintf(str,8, "%#+.5f", val);
    printf("val = %s\n", str);
    
    val = -0.02334563;
    snprintf(str,8, "%#+.5f", val);
    printf("val = %s\n", str);
    
    val = 233.001;
    snprintf(str,8, "%#+.5f", val);
    printf("val = %s\n", str);
    

    输出:

    val = +2.3345
    val = -23.345
    val = -0.0233
    val = +233.00
    val = +0.0003
    

    【讨论】:

    • 我认为 snprintf(str, 8, "%#+.5f", 0.0003);最好的
    • @user1020803 这在所有情况下都有效。在我所有的更改中迷失了方向,不知道为什么在我切换到 snprintf() 后我仍在使用 sig figs。谢谢。编辑以反映。
    【解决方案5】:

    我唯一能想到的如下:

    const char *format = "val = %+6.*f\n";
    int places_past_decimal = ???;
    printf(format, places_past_decimal, 2.334563f);
    

    在这种情况下,您需要传递一个附加参数 (places_past_decimal),它是数字左侧未使用的数字中剩余的位数。

    【讨论】:

    • 我想过,但希望得到最好的解决方案。
    猜你喜欢
    • 2010-12-10
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多