Qt提供了qFuzzyCompare
函数来比较doubles,例如:
bool compare(double value1, double value2)
{
return qFuzzyCompare(value1, value2);
}
如果我尝试比较以下值 387.109287103
和 387.109287101
,qFuzzyCompare
将返回 false
,是什么让有意义,因为值不相等。
如何限制小数位数以比较两个 double 值?
例如,将小数位数限制为 6
,这两个值(387.109287
和 387.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/