有什么区别:
if( a == b )
和
if( qFuzzyCompare(a,b) )
假设变量a和b是:
a = 1234.5678 b = 1234.5678
注意:我问,因为我在Qt中比较双打时遇到问题,我想了解qFuzzyCompare的工作原理.
解决方法
qFuzzyCompare()的
official documentation并没有真正解释为什么会使用它,但通常比较浮点值被认为是一种不好的做法,因为可能会发现两个看似相同的浮点变量由于舍入误差而不同.您可以阅读有关浮点变量
here的这个和其他陷阱的更多信息.
当Qt5.6.0附带的qFuzzyCompare()的源代码分别用于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))); }