让printf()删除值为“.0”的值

时间:2010-03-09 19:24:31

标签: c printf

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

  • 5.12345应仅显示5.1

  • 5.0只应5(不含.0

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

我认为printf()可以做这样的事情......但现在我似乎无法让它发挥作用。

6 个答案:

答案 0 :(得分:8)

您可以使用“%g”

获得您想要的结果
#include <stdio.h>

int main(int argc, char* argv[])
{
        printf("%.6g\n", 5.12345f);
        printf("%.6g\n", 5.0f);
        printf("%.6g\n", 5.0176f);
        return 0;
}

输出:

5.12345
5
5.0176

“%g”将删除尾随零。

答案 1 :(得分:2)

听起来你想要打印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);
}

答案 2 :(得分:1)

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

已经有一段时间了,因为我已经破解了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 - &gt;为什么?因为5.1并不能完全代表(在我的机器上)作为浮点数 - 它是5.09999而且还有一些更改。

你有机会了解floor()和ceil()......

答案 3 :(得分:1)

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

printf("%.1f", 5.12345f);

这将打印5.1

不幸的是,它无法在没有指导的情况下自动确定要显示的内容。 (例如,我的最后一个选项对我来说不清楚 - 为什么它会丢弃“.0176”,而你没有告诉它你想要没有小数点?)

答案 4 :(得分:1)

没有任何格式化运算符支持此功能,但您可以首先过滤floatsprintf(),然后在适当的位置截断字符串。这样可以省去将浮点数转换为字符串的麻烦,其余的逻辑也很简单。

答案 5 :(得分:0)

你可以告诉printf在'。'之后打印指定的位数。 ,但是如果你想根据你必须编写代码的值来区分格式,以区分对你感兴趣的案例。