CC++ & Algorithm

C++小数类型 float 和 double

简单51
语言版本:C++Python
概述:float和double用来存储带小数点的数,比如3.14或0.618,double比float更精确,就像高精度秤和普通秤的区别。

C++ 中的小数:float 和 double 详解

生活中除了整数,还有一大堆带小数点的数:你的身高 1.45 米,体重 35.8 公斤,数学考试得了 92.5 分,或者玩游戏时角色坐标 (10.3, 20.7),买零食花了 3.5 元……在 C++ 里,我们用 floatdouble 来保存这些带小数点的数,它们叫浮点数(就像小数点可以“浮动”一样)。

float 和 double 的区别——普通秤 vs 精密天平

  • float(4 字节)——像家里的厨房秤,能称出大概的克数,但可能有一点点误差。它能保证大约 7 位有效数字(比如 3.1415926 只能精确到 3.141593)。
  • double(8 字节)——像实验室的精密天平,可以测出更精确的值。它能保证大约 15~16 位有效数字,日常计算几乎不会感觉到误差。

在程序里,我们更常用 double,因为现在电脑内存很大,多用一点也没关系,而且更精确省心。

声明和使用时,注意一个小细节:float 数字后面要加 fF,告诉编译器这是 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 / 25 / 2.05.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++ 处理更多有趣的问题了!

例题精讲

1单选题

在C++中,用于存储带小数点的数且精度更高的类型是?

Aint
Bfloat
Cdouble
Dchar
2判断题

在C++中,float类型可以精确表示所有的小数,例如0.1。

3填空题
补全代码,声明一个float类型变量pi,并初始化为3.14159。
___ pi = 3.14159;
4单选题

下列哪个字面量会被C++编译器自动视为double类型?

A3.14f
B3.14F
C3.14
D3
5填空题
补全代码,输出double类型变量d的值。
double d = 2.71828;
cout << ___;