之间有什么区别?
if( a == b )
和
if( qFuzzyCompare(a, b) )
假设变量a和b为:
a = 1234.5678
b = 1234.5678
注意:我问是因为我在比较Qt中的double时遇到麻烦,并且我想了解
qFuzzyCompare
的工作原理。 最佳答案
qFuzzyCompare()
的official documentation并未真正解释为什么要使用此值,但通常比较浮点值被认为是一种不好的做法,因为可能会发现由于舍入误差而导致两个看似相同的浮点变量有所不同。您可能会了解更多有关此以及浮点变量here的其他信息。
当查看qFuzzyCompare()
附带的double和float的Qt5.6.0
源代码时(按住CTRL并单击该函数以在QtCreator
中查看),可以推断出它试图减少不准确的可能性,平等测试:
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2)
{
return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)));
}
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2)
{
return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2)));
}