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

八、常见错误

  1. 整数除法丢小数

    double avg = sum / n;   // 如果 sum、n 都是 int,结果是整数
    

    改成:

    double avg = 1.0 * sum / n;
    
  2. 转换位置错误

    double x = (double)(5 / 2);  // 2.0
    double y = (double)5 / 2;    // 2.5
    
  3. 忘记 #include <iomanip>
    使用 setprecision 必须包含。

  4. 只写 setprecision 不写 fixed

    cout << setprecision(2) << 3.14159;  // 可能输出 3.1
    cout << fixed << setprecision(2) << 3.14159;  // 3.14
    
  5. 浮点数直接用 == 比较
    结果可能不符合预期。

  6. 把浮点数赋给整数时以为会四舍五入

    int x = 3.9;  // 3,不是 4
    
  7. 输入输出类型不匹配

    int a;
    cin >> a;   // 输入 3.14,a 只得到 3
    
  8. 输出多余空格或换行
    考试格式要求严格,按题目要求输出。


九、阅读程序写结果

题目 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)

十一、总结

浮点数与类型转换是一级考试的核心易错点。

  1. 需要小数时用 double。
  2. 两个整数相除,结果是整数。
  3. 要得到小数,至少让一个数变成浮点数。
  4. 强制转换要放在除法之前,注意括号位置。
  5. 保留小数用 fixed << setprecision(n),并包含 <iomanip>。

复习时多练“整数除法 vs 浮点除法”“强制转换位置”“保留小数输出”三类题,考试中先判断参与运算的数据类型,再决定结果是否有小数。