C 正在获取printf()以删除尾随的";。0“;价值观

C 正在获取printf()以删除尾随的";。0“;价值观,c,printf,C,Printf,我需要按以下格式要求打印浮点数: 5.12345应仅显示5.1 5.0只应5(不含.0) 5.0176应仅显示5(不显示.01) 我想printf()可以做这样的事情。。。但现在我似乎无法让它工作。不是你描述的方式,不。如果你想要有条件的小数位数,你必须自己做 我已经有一段时间没有使用printf格式了,但这在大多数情况下似乎都是有效的 char *BuildConditionalFormat(double val) { int tenths = (int)(val * 10) %

我需要按以下格式要求打印浮点数:

  • 5.12345
    应仅显示
    5.1

  • 5.0
    只应
    5
    (不含
    .0

  • 5.0176
    应仅显示
    5
    (不显示
    .01


我想
printf()
可以做这样的事情。。。但现在我似乎无法让它工作。

不是你描述的方式,不。如果你想要有条件的小数位数,你必须自己做

我已经有一段时间没有使用printf格式了,但这在大多数情况下似乎都是有效的

char *BuildConditionalFormat(double val)
{
    int tenths = (int)(val * 10) % 10;
    if (tenths == 0)
        return ".0f";
    return ".1f";
}

/* test rig */
float f = 5.0;
printf(BuildConditionalFormat(f), f); /* -> 5 */
f = 5.13;
printf("\n");
printf(BuildConditionalFormat(f), f); /* -> 5.1 */
printf("\n");
这遵守了您的规则,但也将提供一个有趣的教训,说明为什么浮点会因为5.1->5而臭名昭著。为什么?因为5.1并没有干净地(在我的机器上)表示为一个浮动-它是5.09999,还有一些变化

您可能还需要了解floor()和ceil()。

()可以使用格式化字符串。查看格式化字符串的宽度和精度选项:

printf("%.1f", 5.12345f);
这将打印
5.1


不幸的是,它没有能力在没有指导的情况下自动确定要显示什么。(例如,我不清楚您在那里的最后一个选项-为什么它要删除“.0176”,而不告诉它您不需要小数点?

您可以告诉printf在“.”之后打印指定数量的数字,但是,如果您想根据值来区分格式,则必须编写代码来区分感兴趣的情况。

没有任何格式运算符支持这一点,但是您可以先通过
sprintf()
过滤
浮点值
,然后在适当的情况下截断字符串。这就省去了将浮点值转换为字符串的麻烦,而完成其余操作的逻辑也很简单。

使用“%g”可以获得接近所需结果的结果


“%g”将删除尾随的零。

听起来像是要打印小数点后1位,如果该位为0,则将其删除。此功能应该可以正常工作:

// prints the float into dst, returns the number
// of chars in the manner of snprintf. A truncated
// output due to size limit is not altered.
// A \0 is always appended. 
int printit(float f, char *dst, int max) {
  int c = snprintf(dst, max, "%.1f", f);

  if(c > max) {
    return c;
  }

  // position prior to '\0'
  c--;

  while(dst[c] == '0') {
    c--;
    if(dst[c] == '.') {
      c--;
      break;
    }
  }
  dst[c + 1] = '\0';  
  return c + 1;
}

int main(void) {
  char num1[10], num2[10], num3[10];
  printit(5.12345f, num1, 10);
  printit(5.0f, num2, 10);
  printit(5.0176f, num3, 10);
  printf("%s\n%s\n%s\n", num1, num2, num3);
}

我想我们需要对你想要的结果进行更系统的描述。现在,您已经给出了几个示例,但我完全不确定您想要(比如)15.2的值。您希望最多显示两个有效数字,还是只显示在单位位置,或者具体显示什么?如果出现
5.06
,您希望显示什么?Printf可能会将其四舍五入到
5.1
。是否要删除
.1
?该文件的可能副本不会从5.0 fyi中删除.0,但如果为5.0,则会打印5.0。OP想在这种情况下打印5。@Dana:我不确定那是真的。看看OP的第一个选项-他们想要5.1代替5.12345-不涉及0…我想我应该展示一下使用printf的可能性-OP可以澄清这是否是预期的结果。@里德:它需要做所有这些情况,而不仅仅是第一个。
%.2g
将通过OP的所有三个测试。@Max,我已经查看了手册页。如果他说
%.2g
,然后打印
100
,他得到
1.00e+02
(如果指数大于或等于精度,则
%g
使用科学风格)。我认为这可能不是他想要的。一个问题是,如果需要的话,它不容易支持舍入。在最初的帖子中,没有一个例子显示了任何需要舍入的内容,所以我们不知道这是否是一个要求。
5.12345
5
5.0176
// prints the float into dst, returns the number
// of chars in the manner of snprintf. A truncated
// output due to size limit is not altered.
// A \0 is always appended. 
int printit(float f, char *dst, int max) {
  int c = snprintf(dst, max, "%.1f", f);

  if(c > max) {
    return c;
  }

  // position prior to '\0'
  c--;

  while(dst[c] == '0') {
    c--;
    if(dst[c] == '.') {
      c--;
      break;
    }
  }
  dst[c + 1] = '\0';  
  return c + 1;
}

int main(void) {
  char num1[10], num2[10], num3[10];
  printit(5.12345f, num1, 10);
  printit(5.0f, num2, 10);
  printit(5.0176f, num3, 10);
  printf("%s\n%s\n%s\n", num1, num2, num3);
}