qFuzzyCompare 模糊比较函数

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;
}

适用场景

  1. 图形坐标比较
    判断两个点是否足够接近(例如鼠标点击检测):

    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";
    }
    
  2. 物理模拟
    判断物体位置是否重合(避免因浮点误差导致错误碰撞检测)。

  3. 数学计算
    比较迭代算法的收敛结果。


注意事项

  1. 不适用于整数
    qFuzzyCompare 是为浮点数设计的,对整数比较无意义(直接用 ==)。

  2. 默认 epsilon 值
    Qt 的默认 epsilon 是 1e-12double)和 1e-5float),适合大多数情况。

  3. 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)并记录原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值