printf浮点值的字符串格式

时间:2011-10-30 15:31:56

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

我对使用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

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

5 个答案:

答案 0 :(得分:3)

好老%f

发生了什么事

答案 1 :(得分:1)

使用snprintf()截断字符串,包括\0

的8个字符

格式化字符串:

"%#+.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

答案 2 :(得分:1)

以下(几乎)做你想要的。请注意,我将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.

答案 3 :(得分:0)

"%f"

例如

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

答案 4 :(得分:0)

我能想出的唯一一件事如下:

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

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