Qt 提供了 qFuzzyCompare
函数来比较 double 类型的数值,例如:
bool compare(double value1, double value2)
{
return qFuzzyCompare(value1, value2);
}
如果我要比较以下值
387.109287103
和387.109287101
,qFuzzyCompare
将返回false
,这是有道理的,因为这些值不相等。
如何限制小数位数以比较两个双精度值?
例如,将小数位数限制为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。
10^precision
,转换为int
,然后再进行比较? - Fureeish(qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)));
。因此,你的查询应该已经解决了。 - cse