C语言中如何用%lf让fscanf仅读取两位小数?%.2lf报错
问题分析与解决办法
你用fscanf(file, "%.2lf", &items[i].cost);报错的核心原因:%.2lf是printf/fprintf这类输出函数的格式化符号,fscanf这类输入函数不支持在格式符里加精度控制(.2),这种写法会导致格式匹配失败,触发运行错误。
要实现你需要的效果,分两种场景处理:
场景1:仅需写入文件时显示两位小数
如果只是最终写入文件的内容要呈现1200.00这种格式,不需要修改内存中变量的实际精度,步骤如下:
- 用
%lf正常读取double值,不要加精度控制 - 写入文件时用
%.2lf控制输出格式
示例代码:
// 正确读取double值 fscanf(file, "%lf", &items[i].cost); // 写入文件时格式化输出两位小数 FILE *out_file = fopen("output.txt", "w"); fprintf(out_file, "%.2lf\n", items[i].cost); fclose(out_file);
场景2:需要变量本身存储两位小数的精度
如果要让内存里的items[i].cost本身就是保留两位小数的数值(比如后续计算也需要用这个精度的值),需在读取后对数值做四舍五入处理:
- 正常读取值
- 用
round()函数(需包含<math.h>头文件)将数值乘以100后取整,再除以100.0,实现四舍五入保留两位小数
示例代码:
#include <math.h> // 必须包含该头文件才能使用round函数 // 读取原始值 fscanf(file, "%lf", &items[i].cost); // 处理为两位小数精度的数值 items[i].cost = round(items[i].cost * 100) / 100.0; // 写入文件(此时用%lf或%.2lf输出都能得到两位小数结果) fprintf(out_file, "%.2lf\n", items[i].cost);
补充说明
fscanf的格式符规则:对于double类型,仅支持%lf(或指定宽度如%15lf,表示最多读取15个字符宽度的数值),绝对不能加精度控制(.数字)——这是输入函数和输出函数格式化规则的核心区别,别搞混了。
内容的提问来源于stack exchange,提问作者gauri
相关产品推荐
相关产品推荐

