#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”
答案 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);
这是字符串格式说明符的一个很好的参考。