-2

可能重复:
避免 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;
    }

嗨,我正在尝试扫描浮点数并且我已经让它工作了,但是我得到了我不想要的尾随零。有没有办法避免这种情况?例如,我得到的当前输出是: Next double:"11.540000"

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

4

3 回答 3

5

这不是扫描的问题。这是printf 格式的问题。

从文档(强调我的):

f, F

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

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

克,克

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

于 2013-01-28T19:22:06.537 回答
3

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

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

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

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

于 2013-01-28T19:20:30.137 回答
2

试试这个。

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

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

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

于 2013-01-28T19:22:14.790 回答