-1

在我的代码中,我有大量的平等检查......

例如:

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);
}

它似乎工作......在调试中。然后在发布测试时,它失败了?

假设单个选中项,soitem1item2是相同的,所以无论精度如何,上述长度应该相等....

在调试中,我还没有看到这个失败......但在发布中,它总是失败!

上面的函数 ( length()) 返回一个qreal

我看到的唯一解决方法是
- 实现我自己的相等性检查,限制精度,或者
- 将任何qreal值转换为float.
但这是不合逻辑的(而且工作量很大,我必须检查很多潜在的地方)。

有人可以解释为什么会发生这种情况以及如何最好地解决这个问题吗?

4

1 回答 1

2

您应该将浮点值与例如qFuzzyCompare您已经使用过Qt的 . 您永远不应该将两个浮点变量与简单地使用==.

于 2015-07-16T20:57:40.110 回答