【问题标题】:Formatting floating point numbers in C [duplicate]在C中格式化浮点数[重复]
【发布时间】:2013-01-28 19:17:11
【问题描述】:

可能重复:
Avoid trailing zeroes in printf()

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main(void)
    {
      FILE *file;
      double n;  
      file = fopen("fp.source", "r");
      while(!feof(file)) {
        fscanf(file, "%lf", &n);
        printf("Next double:\"%lf\"\n", n); 
    }
    fclose(file);
    return 0;
    }

您好,我正在尝试扫描浮点数并且我已经让它工作了,但是我得到了我不想要的尾随零。有没有办法避免这种情况?例如,我得到的当前输出是: 下一个双倍:“11.540000”

在现实中我想要: 下一个双倍:“11.54”

【问题讨论】:

  • 这不是扫描的问题。这是printf formatting 的问题。
  • 好吧,我尝试使用 %F 打印,但仍然得到尾随零
  • 为什么不直接使用ciel()floor() 函数?
  • 因为我需要整数部分后面的 .54 或 .342,所以我不需要尾随零。
  • 您错误地使用了feofstackoverflow.com/questions/5431941/…

标签: c printf


【解决方案1】:

这不是扫描的问题。这是printf formatting 的问题。

来自文档(重点是我的):

f,f

double 参数应转换为"[-]ddd.ddd" 样式的十进制表示法,其中基数字符后的位数等于精度规范。 如果精度缺失,则为6;如果精度明确为零并且不存在'#' 标志,则不会出现基数字符。如果出现基数字符,则在它之前至少出现一个数字。低位数字应按实现定义的方式四舍五入。

你可能想要%g(再次强调我的):

克,克

双参数应转换为 f 或 e 样式(或在 G 转换说明符的情况下为 F 或 E 样式),其精度指定有效位数。如果显式精度为零,则应取为 1。使用的样式取决于转换的值;只有当这种转换产生的指数小于 -4 或大于或等于精度时,才应使用样式 e (或 E )。 应从结果的小数部分中删除尾随零;基数字符仅在其后跟数字或存在“#”标志时才会出现。

【讨论】:

    【解决方案2】:

    有没有办法避免这种情况?

    是的,只需正确格式化输出:

    printf("Next double:\"%.0lf\"\n", n);
    

    printf 格式字符串中的.0 表示您不想打印小数点后的任何数字。如果您需要小数点后一位、两位、三位或更多位,您可以将0 更改为其他值。

    【讨论】:

    • 如果我使用 printf("Next double:\"%.0lf\"\n", n);它去掉了需要显示的数字,例如,我有 12.54,它显示的是 12,我需要 .54 但不是后面的 5 个零。
    • @sixlettervariables 指出的 g/G 说明符看起来可以解决问题。
    【解决方案3】:

    试试这个。

    printf("Next double:\"%l.0f\"\n", n); 
    

    这里是字符串格式说明符的一个很好的参考。

    http://www.cplusplus.com/reference/cstdio/printf/

    【讨论】:

      猜你喜欢
      • 2019-07-11
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多