在C中格式化浮点数

时间:2013-01-28 19:17:11

标签: c printf

  

可能重复:
  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”

3 个答案:

答案 0 :(得分:5)

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

从文档(强调我的):

  

f,F

     

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

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

  

g,G

     

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

答案 1 :(得分:3)

  

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

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

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

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

答案 2 :(得分:2)

试试这个。

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

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

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