c++ - 如何比较限制小数位的 double 值?

标签 c++ qt

Qt提供了qFuzzyCompare函数来比较doubles,例如:

bool compare(double value1, double value2)
{
    return qFuzzyCompare(value1, value2);
}

如果我尝试比较以下值 387.109287103387.109287101qFuzzyCompare 将返回 false,是什么让有意义,因为值不相等。

如何限制小数位数以比较两个 double 值?

例如,将小数位数限制为 6,这两个值(387.109287387.109287)将相等。

我已经实现了以下功能来做到这一点:

bool compare(double value1, double value2, quint8 precision)
{
    value1 = QString::number(value1, 'f', precision).toDouble();
    value2 = QString::number(value2, 'f', precision).toDouble();

    return qFuzzyCompare(value1, value2);
}

但我不确定这是否是最好的方法,因为它将值转换为 QString,然后再转换回 double


这里是完整的例子:

#include <QDebug>
#include <QtGlobal>

bool compare(double value1, double value2)
{
    return qFuzzyCompare(value1, value2);
}

bool compare(double value1, double value2, quint8 precision)
{
    value1 = QString::number(value1, 'f', precision).toDouble();
    value2 = QString::number(value2, 'f', precision).toDouble();

    return qFuzzyCompare(value1, value2);
}

int main()
{
    qDebug() << compare(387.109287103, 387.109287101);    // False
    qDebug() << compare(387.109287103, 387.109287101, 6); // True
    return 0;
}

注意:我使用的是 Qt 5.3。

最佳答案

比较两个浮点值的常用方法是将它们彼此相减,得到结果的绝对值,然后将其与一个epsilon 值进行比较。

在你的情况下它可能是这样的

bool compare(double value1, double value2, quint8 precision)
{
    return std::abs(value1 - value2) < std::pow(10, -precision);
}

对于例如精度6 然后 std::pow(10, -precision) 应该等于 0.000001(这是 epsilon),如果两个值之间的差异小于它们被认为是相等的。

关于c++ - 如何比较限制小数位的 double 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47906197/

相关文章:

c++ - Qt - qstring.h 包含字符串错误

qt - QML console.log() 和 console.debug() 不写入控制台

c++ - 使用没有 new 的 QThread

c++ - 发出带有 qt 信号的 std::string

C++ 11 用户定义文字与 Microsoft Visual Studio 2013

c++ - 用于初始化派生类型的通用 switch 语句

c++ - 在 C++ 中映射多个键

c++ - 在不取消停靠和停靠的情况下调整 QDockWidget 的大小

windows - 如何将 Qt 与 Rust 一起使用?

c++ - 两种类型的构造函数重载