2.4 浮点数与类型转换
正在加载视频播放器…
GESP C++ 一级:浮点数与类型转换精讲
核心目标:理解浮点数类型,掌握浮点数的输入输出、保留小数,区分整数除法与浮点除法,掌握隐式转换和显式转换。
要小数,就至少让参与运算的一个数是浮点数;要取整,就用强制转换或整数除法。
一、浮点数是什么
浮点数就是小数,用来表示带小数点的数。
例如:
3.14
0.5
-2.75
100.0
一级常用浮点类型:
| 类型 | 含义 | 精度 | 建议 |
|---|---|---|---|
float |
单精度浮点数 | 约 6~7 位有效数字 | 一级了解 |
double |
双精度浮点数 | 约 15~16 位有效数字 | 一级首选 |
考试提示:GESP 一级中,需要小数时优先用
double,精度更高,不容易出错。
二、浮点变量的声明与初始化
double a = 3.14;
double b = 0.5;
float c = 1.5f; // 了解
声明后赋值:
double x;
x = 2.5;
一次声明多个:
double a = 1.0, b = 2.0, c;
注意:
- 浮点数可以写
3.0,也可以写3.,但建议写3.0。 - 整数赋给浮点变量会自动变成小数:
double x = 5; // x = 5.0
三、浮点数的输入与输出
1. 输入
double x;
cin >> x;
可以输入:
3.14
也可以输入整数:
5
此时 x 会变成 5.0。
2. 输出
double x = 3.14;
cout << x << endl;
默认输出可能不是固定小数位,考试中如果需要保留小数,必须手动设置。
3. 保留小数输出
需要头文件:
#include <iomanip>
写法:
cout << fixed << setprecision(2) << ans << endl;
表示保留 2 位小数。
示例:
double ans = 2.5;
cout << fixed << setprecision(2) << ans << endl;
输出:
2.50
注意:
fixed表示固定小数位。setprecision(2)表示小数点后 2 位。- 只写
setprecision(2)不加fixed,含义是有效数字位数,一级容易混淆。
四、整数除法与浮点除法
这是 GESP 一级最高频的易错点。
1. 两个整数相除,结果是整数
cout << 5 / 2 << endl; // 输出 2
不是 2.5,因为 5 和 2 都是整数,做的是整数除法,小数部分被丢弃。
2. 至少一个浮点数,结果才是小数
cout << 5.0 / 2 << endl; // 2.5
cout << 5 / 2.0 << endl; // 2.5
cout << 5.0 / 2.0 << endl; // 2.5
3. 常用技巧
int a = 5, b = 2;
double c = 1.0 * a / b; // 2.5
double d = (double)a / b; // 2.5
4. 对比表
| 表达式 | 结果 | 说明 |
|---|---|---|
5 / 2 |
2 |
整数除法 |
5.0 / 2 |
2.5 |
浮点除法 |
5 / 2.0 |
||
(double)5 / 2 |
先转 double | |
(double)(5 / 2) |
2.0 |
先整数除,再转 double |
1.0 * 5 / 2 |
2.5 |
常用技巧 |
记忆:先算括号,再算乘除;转换要放在除法之前。
五、类型转换
类型转换就是把一种数据类型变成另一种数据类型。
1. 隐式转换(自动转换)
计算机自动完成,不需要写转换符号。
int a = 5;
double b = a; // 5 变成 5.0
double c = 5 + 2.5; // 5 自动变成 5.0,结果 7.5
常见规则:
- 小类型 → 大类型:安全。
- 整数 → 浮点:补
.0。 - 浮点 → 整数:小数部分被截断。
int x = 3.9; // x = 3,不是 4
int y = 3.1; // y = 3
int z = -3.9; // z = -3,向零截断
2. 显式转换(强制转换)
自己写代码强制转换类型。
写法:
(类型)变量
示例:
int a = 5, b = 2;
double c = (double)a / b; // 2.5
也可以:
double d = (double)(a / b); // 2.0,因为先算整数除法
对比:
(double)a / b; // 先把 a 转成 double,再除,结果 2.5
(double)(a / b); // 先算 a/b 得 2,再转 double,结果 2.0
一级重点:转换符号的位置决定结果,括号很重要。
3. 字符与整数转换(了解)
char c = 'A';
int x = c; // 65
cout << (int)c; // 65
cout << (char)65; // A
六、浮点数的精度与比较
浮点数不能精确表示所有小数,例如 0.1 在计算机中只是近似值。
因此:
double a = 0.1 + 0.2;
if (a == 0.3) { // 不推荐
// 可能不成立
}
正确比较方式(了解):
#include <cmath>
if (fabs(a - 0.3) < 1e-6) {
// 认为相等
}
一级考试中一般不要求深入,但要知道:浮点数不要直接用 == 比较。
七、常见转换场景
1. 求平均分
int sum = 275, n = 3;
double avg = 1.0 * sum / n;
cout << fixed << setprecision(2) << avg << endl;
输出:
91.67
2. 圆面积
const double PI = 3.14159;
double r;
cin >> r;
double area = PI * r * r;
cout << fixed << setprecision(2) << area << endl;
3. 温度转换
double c;
cin >> c;
double f = c * 9 / 5 + 32;
cout << fixed << setprecision(1) << f << endl;
注意:c 是 double,所以 c * 9 / 5 是浮点运算。
4. 取整数部分
double x = 3.9;
int n = (int)x; // 3
5. 四舍五入(了解)
double x = 3.6;
int n = (int)(x + 0.5); // 4
八、常见错误
-
整数除法丢小数
double avg = sum / n; // 如果 sum、n 都是 int,结果是整数改成:
double avg = 1.0 * sum / n; -
转换位置错误
double x = (double)(5 / 2); // 2.0 double y = (double)5 / 2; // 2.5 -
忘记
#include <iomanip>
使用setprecision必须包含。 -
只写
setprecision不写fixedcout << setprecision(2) << 3.14159; // 可能输出 3.1 cout << fixed << setprecision(2) << 3.14159; // 3.14 -
浮点数直接用
==比较
结果可能不符合预期。 -
把浮点数赋给整数时以为会四舍五入
int x = 3.9; // 3,不是 4 -
输入输出类型不匹配
int a; cin >> a; // 输入 3.14,a 只得到 3 -
输出多余空格或换行
考试格式要求严格,按题目要求输出。
九、阅读程序写结果
题目 1
cout << 7 / 2 << endl;
输出:
3
题目 2
cout << 7.0 / 2 << endl;
输出:
3.5
题目 3
int a = 5, b = 2;
double c = (double)a / b;
cout << c << endl;
输出:
2.5
题目 4
int a = 5, b = 2;
double c = (double)(a / b);
cout << c << endl;
输出:
2
题目 5
double x = 3.14159;
cout << fixed << setprecision(3) << x << endl;
输出:
3.142
题目 6
int x = 3.99;
cout << x << endl;
输出:
3
十、速查表
| 需求 | 写法 |
|---|---|
| 声明小数 | double x; |
| 输入小数 | cin >> x; |
| 输出小数 | cout << x; |
| 保留 2 位小数 | cout << fixed << setprecision(2) << x; |
| 整数转小数 | double y = a; 或 (double)a |
| 小数转整数 | int n = (int)x; |
| 浮点除法 | 1.0 * a / b 或 (double)a / b |
| 整数除法 | a / b |
| 取整 | (int)x |
| 四舍五入(了解) | (int)(x + 0.5) |
十一、总结
浮点数与类型转换是一级考试的核心易错点。
- 需要小数时用
double。 - 两个整数相除,结果是整数。
- 要得到小数,至少让一个数变成浮点数。
- 强制转换要放在除法之前,注意括号位置。
- 保留小数用
fixed << setprecision(n),并包含<iomanip>。
复习时多练“整数除法 vs 浮点除法”“强制转换位置”“保留小数输出”三类题,考试中先判断参与运算的数据类型,再决定结果是否有小数。