qFuzzyCompare
是 Qt 提供的一个 模糊比较函数,主要用于 浮点数(float
/double
)的近似相等判断,避免直接使用 ==
比较浮点数时因精度问题导致的误判。它通过允许一定的误差范围(epsilon)来判断两个浮点数是否“足够接近”。
函数原型
#include <QtGlobal> // 头文件
bool qFuzzyCompare(double p1, double p2); // 比较 double
bool qFuzzyCompare(float p1, float p2); // 比较 float
为什么需要 qFuzzyCompare
?
浮点数在计算机中存储时存在精度限制,直接比较可能因微小误差失败。例如:
double a = 0.1 + 0.2;
double b = 0.3;
if (a == b) { /* 可能不成立! */ }
此时 qFuzzyCompare(a, b)
会返回 true
,因为二者的差异在允许的误差范围内。
使用方法
基本示例
#include <QtGlobal>
#include <QDebug>
int main() {
double x = 1.0;
double y = 1.0000001;
if (qFuzzyCompare(x, y)) {
qDebug() << "x and y are approximately equal";
} else {
qDebug() << "x and y are NOT equal";
}
return 0;
}
输出:
x and y are approximately equal
比较自定义容差
如果需要调整误差范围(epsilon),可以用 qAbs
和自定义阈值:
bool fuzzyEqual(double a, double b, double epsilon = 1e-5) {
return qAbs(a - b) <= epsilon;
}
适用场景
-
图形坐标比较
判断两个点是否足够接近(例如鼠标点击检测):QPointF p1(10.0, 20.0); QPointF p2(10.00001, 20.00001); if (qFuzzyCompare(p1.x(), p2.x()) && qFuzzyCompare(p1.y(), p2.y())) { qDebug() << "Points are close enough"; }
-
物理模拟
判断物体位置是否重合(避免因浮点误差导致错误碰撞检测)。 -
数学计算
比较迭代算法的收敛结果。
注意事项
-
不适用于整数
qFuzzyCompare
是为浮点数设计的,对整数比较无意义(直接用==
)。 -
默认 epsilon 值
Qt 的默认 epsilon 是1e-12
(double
)和1e-5
(float
),适合大多数情况。 -
NaN 和 Inf
qFuzzyCompare(NaN, NaN)
返回false
,因为 NaN 不等于任何值(包括自身)。需额外处理:if (qIsNaN(a) && qIsNaN(b)) { /* 处理 NaN */ }
对比其他方法
方法 | 用途 | 示例 |
---|---|---|
qFuzzyCompare | 浮点数近似比较 | qFuzzyCompare(a, b) |
== | 精确比较(仅限整数或确定精度) | a == b |
qAbs(a - b) < eps | 自定义误差范围 | qAbs(a - b) <= 1e-5 |
总结
- 何时用:需要容忍浮点数微小误差时(如坐标、几何计算)。
- 何时不用:对精度要求严格或操作整数时。
- 替代方案:
std::abs(a - b) < epsilon
(C++ 标准库方式)。
代码规范建议:
✅ 在 Qt 项目中优先用 qFuzzyCompare
替代裸 ==
比较浮点数。
✅ 对关键逻辑(如金融计算),明确指定容差(epsilon)并记录原因。