В моем коде у меня есть большое количество проверок на равенство …
например:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);QGraphicsLineItem* x = new QGraphicsLineItem(50, 50, -50, -50);
QGraphicsView view(new QGraphicsScene(-200, -150, 400, 300) );
view.scene()->addItem(x);
view.show();
bool sameLine = true;
QLineF line1 = x->line();
qreal _length = line1.length();
foreach(QGraphicsItem* item, view.scene()->selectedItems())
{
QGraphicsLineItem *item2 = dynamic_cast<QGraphicsLineItem*>(item);
if(item2->line().length() != _length )
sameLine = false;
}
qDebug("same line: %d", sameLine);
}
Вроде работает … в отладке. Тогда когда тестируется в релизе, это не получается?
Предположим, один выбранный элемент, так item1
а также item2
одинаковы, поэтому, независимо от точности, вышеуказанные длины должны быть равны ….
В отладке я не смог увидеть этот сбой … но в выпуске он всегда терпит неудачу!
Функции выше (length()
) вернуть qreal
Единственные обходные пути, которые я вижу, будут
— реализовать мою собственную проверку на равенство, которая ограничивает точность, или
— бросить любой qreal
значения для float
,
Но это нелогично (и много работы, я должен был бы проверить много потенциальных мест).
Может кто-нибудь объяснить, почему это происходит и как лучше обойти эту проблему?
Вы должны сравнить значения с плавающей точкой, например, с qFuzzyCompare
если вы уже используете Qt
, Вы никогда не должны сравнивать две переменные с плавающей точкой просто ==
,