You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何用%lf让fscanf仅读取两位小数?%.2lf报错

问题分析与解决办法

你用fscanf(file, "%.2lf", &items[i].cost);报错的核心原因:%.2lf是printf/fprintf这类输出函数的格式化符号,fscanf这类输入函数不支持在格式符里加精度控制(.2),这种写法会导致格式匹配失败,触发运行错误。

要实现你需要的效果,分两种场景处理:

场景1:仅需写入文件时显示两位小数

如果只是最终写入文件的内容要呈现1200.00这种格式,不需要修改内存中变量的实际精度,步骤如下:

  1. 用%lf正常读取double值,不要加精度控制
  2. 写入文件时用%.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本身就是保留两位小数的数值(比如后续计算也需要用这个精度的值),需在读取后对数值做四舍五入处理:

  1. 正常读取值
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:17:04