浮点数比较出错是因为二进制无法精确表示大多数十进制小数,如0.1在内存中为无限循环二进制小数而产生舍入误差;直接用==判断几乎总返回false,应改用误差范围比较,如abs(a - b)
为什么
float和double比较会出错因为二进制无法精确表示大多数十进制小数,比如
0.1在内存里是无限循环二进制小数,存进去就带误差。直接用==判断两个double是否相等,几乎总是错的。
- 常见错误现象:
0.1 + 0.2 == 0.3返回false- 正确做法:改用「误差范围比较」,比如
abs(a - b)- 注意
1e-9不是万能阈值——double有效位约 15–17 位,float只有 6–7 位,大数值时相对误差会放大- 别用
std::numeric_limits<double>::epsilon()</double>直接当阈值,它表示的是1.0附近的最小可区分差值,不是通用容差什么时候该用
long double或整数缩放
long double在不同平台差异极大:x86_64 Linux 通常是 80 位扩展精度(≈19 位十进制),Windows MSVC 却常退化成普通double;整数缩放则完全规避浮点误差,但要自己管单位和溢出。
- 适用场景:金融计算、固定小数位计数(如价格用
int存「分」)、物理模拟中已知量级且需确定性- 整数缩放示例:把
123.45存成12345(单位为0.01),所有加减乘除都对整数做,最后再除以100- 风险点:
long double的sizeof和行为不跨平台一致,CI 构建环境可能和本地不同- 别指望
long double解决所有问题——它只是延迟了精度瓶颈,不是消除它
std::setprecision和std::fixed只影响输出,不改变值本身很多人以为调了输出格式就能“修复”精度,其实只是掩盖问题。打印出来的
0.300000还是那个不等于0.3的数。
- 典型误用:
cout 输出 <code>0.3,但后续参与计算仍用原值- 真正需要控制显示时,优先用
std::round(x * 100) / 100.0显式舍入(注意:这会引入新误差)- 调试时建议用
printf("%.17g", x)查看真实存储值,%g能暴露隐藏的尾部数字使用
std::abs而不是裸写fabs,并小心模板推导C++ 标准库重载了
std::abs,能适配float/double/long double,而 C 风格的fabs是函数族,容易因隐式转换导致精度丢失或编译失败。立即学习“C++免费学习笔记(深入)”;
- 错误写法:
fabs(1.5f)可能调用double fabs(double),把float升级再降级- 推荐写法:
std::abs(x),依赖 ADL 或标准重载,类型安全- 模板函数里尤其要注意:如果参数是模板类型
T,直接写std::abs(t)比fabs(t)更可靠- 别忽略
#include <cmath></cmath>—— 缺失时某些编译器可能静默链接到 C 版本,行为不一致浮点数的“误差”不是 bug,是硬件和数学共同决定的特性。真正难的不是记住怎么写容差,而是判断当前场景下——这个误差是否会影响逻辑分支、是否会在多次迭代中累积、是否暴露给用户造成困惑。这些得靠具体数值范围和业务语义来定,没法套公式。
0
0
相关文章
C++利用协程如何封装非阻塞的Redis异步驱动?(数据库访问优化)
c++中如何处理空指针和野指针问题_c++指针安全性检查方法
c++如何使用getline读取一行_c++带空格字符串输入【实用】
C++如何优雅地获取当前文件的行号和文件名?(调试神器)
C++怎么判断奇偶 C++取模运算基础用法【入门】
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。
595
2024.04.28
在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。
1010
2023.08.02
int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
610
2024.08.29
本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。
3
2026.03.11
热门下载
相关下载
最新文章






