C++小数类型 float 和 double
简单51C++ 中的小数:float 和 double 详解
生活中除了整数,还有一大堆带小数点的数:你的身高 1.45 米,体重 35.8 公斤,数学考试得了 92.5 分,或者玩游戏时角色坐标 (10.3, 20.7),买零食花了 3.5 元……在 C++ 里,我们用 float 和 double 来保存这些带小数点的数,它们叫浮点数(就像小数点可以“浮动”一样)。
float 和 double 的区别——普通秤 vs 精密天平
- float(4 字节)——像家里的厨房秤,能称出大概的克数,但可能有一点点误差。它能保证大约 7 位有效数字(比如 3.1415926 只能精确到 3.141593)。
- double(8 字节)——像实验室的精密天平,可以测出更精确的值。它能保证大约 15~16 位有效数字,日常计算几乎不会感觉到误差。
在程序里,我们更常用 double,因为现在电脑内存很大,多用一点也没关系,而且更精确省心。
声明和使用时,注意一个小细节:float 数字后面要加 f 或 F,告诉编译器这是 float 类型;double 不需要加后缀。
float height = 1.45f; // 身高,单位:米(float 要加 f)
double weight = 35.8; // 体重,单位:公斤(double 不用加后缀)
double pi = 3.141592653589793; // 圆周率,double 可以存更多位
如果给 float 变量赋值时没写
f,比如float a = 1.2;,编译器会先当作 double 再转成 float,可能会产生一个警告(但程序还能运行)。养成加f的好习惯。
浮点数能做哪些运算?
加减乘除样样行,结果依然是小数:
double a = 1.2; // 第一个数
double b = 2.3; // 第二个数
double sum = a + b; // 和 = 3.5
double diff = b - a; // 差 = 1.1
double product = a * b; // 积 = 2.76
double quotient = a / b; // 商 ≈ 0.521739...
注意:如果两个整数相除,比如 5 / 2,结果会是整数 2(因为两边都是 int)。想让结果带小数,至少把其中一个写成小数形式:5.0 / 2 或 5 / 2.0 或 5.0 / 2.0。
int x = 5; // 整数
int y = 2; // 整数
double wrong = x / y; // 错误!结果是 2.0,不是 2.5
double correct1 = 5.0 / 2; // 正确:2.5
double correct2 = (double)x / y; // 正确:把 x 转成 double 再除
生活中的浮点数例子
1. 计算找零
你买了 2.5 元的铅笔,给了 10 元,应找回多少钱?
double price = 2.5; // 铅笔价格
double money = 10.0; // 你付的钱
double change = money - price; // 找零 = 7.5
cout << "应找回 " << change << " 元" << endl;
2. 平均分
语文 88.5 分,数学 92.0 分,英语 95.5 分,求平均分。
double chinese = 88.5; // 语文成绩
double math = 92.0; // 数学成绩
double english = 95.5; // 英语成绩
double average = (chinese + math + english) / 3.0; // 平均分 ≈ 92.0
cout << "平均分 = " << average << endl;
3. 速度计算
你骑自行车 1.5 小时骑了 12 公里,速度是多少?
double distance = 12.0; // 距离,公里
double time = 1.5; // 时间,小时
double speed = distance / time; // 速度 = 8 公里/小时
cout << "速度 = " << speed << " km/h" << endl;
新手容易踩的坑
坑 1:忘记加 f
float f1 = 3.14; // 警告:double 转 float 可能丢失精度
float f2 = 3.14f; // 正确
坑 2:整数相除得到整数
前面已经说过,一定要让至少一个操作数是小数。
坑 3:直接用 == 比较两个浮点数是否相等
因为浮点数在计算机内部是二进制表示的,很多小数(比如 0.1)无法精确存储,会出现神奇的现象:
double a = 0.1;
double b = 0.2;
double c = a + b; // 理论上 c 应该是 0.3
if(c == 0.3) {
cout << "相等" << endl; // 很可能不会执行!
} else {
cout << "不相等" << endl; // 实际输出的是这个
}
运行结果会显示 不相等,因为 c 的实际值可能是 0.30000000000000004。正确的比较方法是看差值是否小于一个很小的数,比如 1e-9。
double epsilon = 1e-9; // 一个很小的数,相当于 0.000000001
if(abs(c - 0.3) < epsilon) {
cout << "它们近似相等" << endl; // 输出这个
}
完整示例:计算圆的面积(更详细版)
我们写一个完整的程序,让用户输入圆的半径,然后输出面积(π 取 3.14159)。
#include <iostream>
using namespace std;
int main() {
double radius; // 圆的半径
double pi = 3.14159; // 圆周率(用 double 更精确)
cout << "请输入圆的半径:";
cin >> radius; // 从键盘读取半径
double area = pi * radius * radius; // 面积公式
cout << "圆的面积 = " << area << endl;
return 0;
}
运行示例:
请输入圆的半径:2.5
圆的面积 = 19.6349
如果想保留更多小数,可以用 cout << fixed; 和 cout.precision() 来控制输出格式。
该用 float 还是 double?
- 在普通比赛、游戏开发、日常计算中,用
double就行,不用担心精度。 - 如果内存非常紧张(比如嵌入式设备、单片机),或者要存几百万个小数,才考虑用
float。 - 新手直接记住:默认用 double,省心又准确。
相关知识点指引
- C++基本数据类型(int、char、bool…)——认识所有基础类型。
- 输入输出 cin 和 cout——学学怎么和用户交互。
- 强制类型转换——把 int 转 double,避免整数除法。
- 数学函数(sqrt、pow、abs)——计算平方根、次方等更复杂的数学运算。
浮点数就像我们生活中无处不在的小数一样,掌握它,你就能用 C++ 处理更多有趣的问题了!
例题精讲
在C++中,用于存储带小数点的数且精度更高的类型是?
在C++中,float类型可以精确表示所有的小数,例如0.1。
补全代码,声明一个float类型变量pi,并初始化为3.14159。
___ pi = 3.14159;下列哪个字面量会被C++编译器自动视为double类型?
补全代码,输出double类型变量d的值。
double d = 2.71828;
cout << ___;