【问题标题】:Using printf to give the output as precise as the input?使用 printf 使输出与输入一样精确?
【发布时间】:2014-01-02 09:01:33
【问题描述】:

我想编写一个输出与输入一样精确的代码。考虑我是否执行了

scanf("%f", &n);
printf("%f", n);

如果我将1.2 作为输入,它应该输出1.2,但它输出1.200000。它也应该与整数相同,如果我将9 作为输入,它应该只输出9,而不是9.00。有什么办法可以做到吗?

【问题讨论】:

  • 一种方法是将它们存储为字符串。对于计算,只需使用 atof 进行转换即可。
  • @BLUEPIXY : %g 在某些情况下可能会选择 e-notation 格式。
  • @MadHatter 我知道。但指出有价值。,
  • @BLUEPIXY:好的!我指出了这一点,因为我认为 OP 可能不想那样打印。无论如何,这肯定是有价值的。 :)

标签: c printf


【解决方案1】:

OP 没有指定如何处理像“9.00”这样的输入。我假设 OP 希望看到打印“9.00”而不是“9”,因为输入给出了十分之一和百分之一的位置。

需要先将数字作为字符串读取,以便稍后评估其精度。数字及其精度需要单独的变量。建议使用@bgamlath 中的结构。

使用sscanf()atof() 解析字符串。
解析'.'位置的字符串。

int VikasRead(float *value, int *precision) {
  char buf[100];
  *precision = 0;
  if (fgets(buf, sizeof buf, stdin) == NULL) return EOF;
  int end;
  int retval = sscanf(buf, "%f%n", value, &end);
  char * dp = strchr(buf, '.');
  if (dp != NULL && retval == 1) {
    *precision = &buf[end] - dp;
  }
  return retval;
}

int VikasWrite(float value, int precision) {
  int retval;
  if (precision > 1) {
    // Note: printf("%.*f\n", 0, value) is UB.
    retval = printf("%.*f\n", precision - 1, value);  // 1.234
  }
  else if (precision == 0) {;
    retval = printf("%.0f\n", value);  // 123
    }
  else {
    retval = printf("%#.0f\n", value); // 123.
  }
  return retval;
}

void VikasTest(void) {
  float value;
  int precision;
  while (VikasRead(&value, &precision) == 1) {
    VikasWrite(value, precision);
  }
}

1.23e56 这样的指数输入会使过程复杂化,但方法仍然相同。需要另外查找'e''E'

某些语言环境使用',' 作为小数点,这使事情变得更加复杂。

【讨论】:

    【解决方案2】:

    一种解决方案是按原样存储所有用户输入。使用char 指针和gets()scanf("%s", ...)

    如果您也想在计算中使用它们,请使用atof 进行转换。

    此外,您可以使用结构来存储输入表示和数值。

    stract Number{
     float val;
     char * representaion; // or only precision if you like.
    }
    

    【讨论】:

      【解决方案3】:

      尝试使用宽度说明符:

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

      阅读this了解更多详情。

      但是,需要注意的一点:对于floatdouble:由于精度限制,您可能无法将1.2 打印为1.2000 甚至1.2,它可能会变成1.1996... 之类的那。

      嗯,这是完全不同的话题,并且在 SO 上得到了很好的讨论,您可以尝试在互联网上或在 SO 上搜索相同的内容。

      更新:
      对于可变精度,您可以使用printf("%*f", <width>, <float number>);。更多详情here.

      【讨论】:

        【解决方案4】:

        使用格式说明符%0.7g,因为float的最大精度为7位

        #include <stdio.h>
        
        int numberLenght(float d);
        
        int main(void)
        {
            float d;
            printf("input: ");
            scanf("%f", &d);
            printf("your input was: %0.7g\n", d);
            return 0;
        }
        

        对于double,使用%0.16gdouble 的最大精度为 16 位)

        【讨论】:

        猜你喜欢
        • 2020-11-14
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 2020-09-16
        • 1970-01-01
        • 2014-04-11
        • 1970-01-01
        • 2014-06-12
        相关资源
        最近更新 更多