C 语言里面小数也就是浮点数,主要使用 float 单精度和 double 双精度两种类型存储,写代码的时候小数常量可以直接写带小数点的形式,也可以写成科学计数法形式,输出的时候 printf 要用 % f 或者 % lf 占位符。这个知识点是 C 语言基础必考内容,很多初学者容易混淆 float 和 double 区别,还有整数除法得到小数丢失精度的坑。整体结论就是普通作业优先选用 double,精度更高,是处理小数首选类型。
一 两种浮点数据类型
1 float 单精度浮点数
占用 4 字节内存,有效数字大约 6 到 7 位,适合精度要求不高的小数
定义写法
float a = 3.14f;
末尾加 f 代表这个常量是 float 类型,不加 f 默认会当成 double
2 double 双精度浮点数
占用 8 字节内存,有效数字大约 15 到 16 位,精度更高,课程作业推荐使用
定义写法
double b = 3.1415926;
二 小数常量两种书写方式
1 普通小数写法
3.14 0.5 -12.8
2 科学计数法写法
比如 1.23e5 代表 1.23 乘以 10 的 5 次方,也就是 123000
2.5e-3 代表 0.0025
字母 e 不区分大小写,也可以写 E
三 printf 输出小数 占位符规则
% f 用来输出 double 类型浮点数,float 在 printf 里面会自动提升成 double,所以 float 也可以用 % f 输出
%.nf 代表保留 n 位小数,例如 %.2f 保留两位小数
示例
include
int main()
{
double num = 3.14159;
printf("%f\n", num); //默认输出6位小数
printf("%.2f\n", num); //保留两位小数
return 0;
}
四 scanf 输入小数
double 输入使用 % lf
float 输入使用 % f
示例
double x;
scanf("%lf",&x);
重点区分 printf 里面 double 是 % f,scanf 里面 double 是 % lf,这个是高频易错点
五 重要易错点 整数除法
如果两个 int 变量直接相除,例如 5/2,结果是整数 2,不会得到 2.5
想要得到小数结果,至少其中一个数字要转成浮点类型
正确写法
double res = 5.0 / 2;
六 类型对照表
| 类型 | 字节 | 有效位数 | scanf 占位符 | printf 占位符 |
|---|---|---|---|---|
| float | 4 字节 | 6~7 位 | %f | %f |
| double | 8 字节 | 15~16 位 | %lf | %f |
七 补充说明
浮点数是二进制近似存储,不是绝对精确,非常大或者非常小的小数运算会存在微小误差,课程基础编程题一般不需要深入研究这个特性。
【常见问题】
问题 1 c 语言小数怎么表示,float 和 double 选哪个更好
回答 1 c 语言小数怎么表示,日常课程作业优先选 double,双精度精度更高,float 单精度容易精度丢失,是 c 语言小数怎么表示首选类型。
问题 2 c 语言小数怎么表示,为什么 5/2 得不到小数
回答 1 c 语言小数怎么表示,两个整数相除是整数除法,结果会舍弃小数部分,写成 5.0/2 才可以得到小数,是 c 语言小数怎么表示经典坑点。
问题 3 c 语言小数怎么表示,scanf 读 double 为什么要用 % lf
回答 1 c 语言小数怎么表示,scanf 读取 double 必须写 % lf,但是 printf 输出 double 写 % f 就可以,这个是 c 语言小数怎么表示最容易记混的地方。
问题 4 c 语言小数怎么表示,科学计数法 e 是什么意思
回答 1 c 语言小数怎么表示,e 代表 10 的幂次,比如 2e3 就是 2 乘以 10 的 3 次方,是 c 语言小数怎么表示常量第二种书写格式。
【免责申明】
本文基于标准 C 语言讲解浮点数基础用法,浮点数二进制近似特性属于进阶内容,考试答题以教材表述为准,代码仅用于学习参考。


