C++浮点数使用注意事项

C++ 浮点数使用中,核心注意事项是精度误差、格式化输出控制、类型选择与比较方式,具体要点如下:

1. 两种浮点数类型

类型 关键字 精度 占用空间 记忆口诀
单精度 float 约 6-7 位有效数字 4 字节 小盒子,装得少
双精度 double 约 15-16 位有效数字 8 字节 大盒子,装得多

建议 :信奥竞赛中,无脑选 doublefloat 精度太低,容易踩坑。

2. 最大陷阱:精度误差

浮点数在计算机中是用二进制存储的,很多十进制小数无法被精确表示

cpp 复制代码
double a = 0.1 + 0.2;
cout << a << endl; // 输出可能是 0.30000000000000004,而不是 0.3!

后果 :直接用 == 比较两个浮点数,可能会出错。

cpp 复制代码
double a = 0.1 + 0.2;
if (a == 0.3) {
    cout << "相等"; // 这行代码可能不会执行!
}

正确做法:用一个极小的数(叫"容差")来比较:

cpp 复制代码
double a = 0.1 + 0.2;
if (abs(a - 0.3) < 1e-8) { // 1e-8 就是 0.00000001
    cout << "相等";
}

口诀浮点数比较,永远不要用 ==,要用"差值小于一个很小的数"来判断。

3. 格式化输出(printf 控制小数位数)

这是信奥竞赛中最常用的技巧:

cpp 复制代码
double pi = 3.14159265;

printf("%.2f\n", pi); // 保留2位小数,输出 3.14(四舍五入)
printf("%.4f\n", pi); // 保留4位小数,输出 3.1416
printf("%.0f\n", pi); // 保留0位小数,输出 3

注意printf%f 默认保留 6 位小数 ,如果题目要求不同位数,一定要用 %.nf 指定。

4. cin/cout 控制小数位数

如果用 cout,需要加 <iomanip> 头文件:

cpp 复制代码
#include <iomanip>
double pi = 3.14159265;

cout << fixed << setprecision(2) << pi << endl; // 输出 3.14

注意fixedsetprecision 一旦设置,后面所有的 cout 都会受影响,直到你重新设置。

5. 整数除法 vs 浮点除法

这是孩子们最容易犯的错

cpp 复制代码
cout << 7 / 2 << endl;     // 输出 3(整数除法,直接砍掉小数)
cout << 7.0 / 2 << endl;   // 输出 3.5(浮点除法)
cout << (double)7 / 2 << endl; // 输出 3.5(强制转换)

口诀只要有一个操作数是浮点数,结果就是浮点数。两个都是整数,结果就是整数(小数部分直接扔掉)。

6. scanfprintf 的占位符

cpp 复制代码
double x;
scanf("%lf", &x);   // 读入 double,注意是 %lf(有个 l)
printf("%f", x);    // 输出 double,用 %f 就行(输出时不用加 l)

易错点scanfdouble%lfprintf 输出 double%f。很多孩子在这里搞混。

7. 浮点数的特殊值

cpp 复制代码
double a = 1.0 / 0.0;  // 结果是 inf(无穷大)
double b = 0.0 / 0.0;  // 结果是 nan(不是一个数)

在信奥竞赛中,尽量避免除以零。如果不确定,可以先判断分母是否为零。

📌 总结速查表

注意事项 正确做法
类型选择 统一用 double
比较大小 abs(a-b) < 1e-8,不用 ==
保留小数 printf("%.nf", x)cout << fixed << setprecision(n)
除法陷阱 确保至少一个操作数是浮点数
scanf 读入 double%lffloat%f
默认输出 printf%f 默认 6 位小数
相关推荐
阿米亚波1 分钟前
【C++ STL】std::unordered_multiset
开发语言·数据结构·c++·笔记·stl
随意起个昵称6 分钟前
贪心模型-Johnson法则
c++·算法
蜡笔小马8 分钟前
【保姆级教程】Windows 下 CGAL 6.2 + VS2022 全流程实战:从源码编译到项目集成(附避坑指南)
c++·cgal
我是唐青枫10 分钟前
Java ReentrantLock 实战详解:比 synchronized 更灵活的可重入锁
java·开发语言
QH1392923188021 分钟前
# R&S ZNB43 ZNA43 ZNA67矢量网络分析仪
开发语言·网络·php
xiaoye-duck29 分钟前
《Linux系统编程》Linux 系统多线程(八): C++ 高并发线程池全链路深度解析与从零手撕实现
linux·c++·线程池
胖大和尚1 小时前
在C++的类中,是否可以把函数声明成__device__
c++·cuda
脚踏实地皮皮晨1 小时前
003003001_Grid控件
开发语言·windows·算法·c#·visual studio
十年磨剑走天涯1 小时前
C++ STL 容器操作复杂度速查表
开发语言·c++
always_TT1 小时前
【Python requirements.txt 依赖管理】
开发语言·python