C++ 在Qt中使用基本类型时挂起

C++ 在Qt中使用基本类型时挂起,c++,qt,C++,Qt,在程序中,我希望将数字0.12345显示为.12345,删除lineEdit中的第一个零。为此,我编写了以下简单代码: QString s; QTextStream ss(&s); double temp = 0.12345; int n = 0; if(temp > 0) { ss << "."; while (true) { temp *= 10; n = temp; if (temp ==

在程序中,我希望将数字0.12345显示为.12345,删除lineEdit中的第一个零。为此,我编写了以下简单代码:

QString s;
QTextStream ss(&s);

double temp = 0.12345;
int n = 0;

if(temp > 0)
{
    ss << ".";
    while (true)
    {
        temp *= 10;
        n = temp;
        if (temp == n)
            break;
    }
    ss << n;
}
lineEdit->setText(s);
当我运行它时,程序和Qt Creator挂起,我需要重新运行它以正常退出

请问程序那样运行有什么问题?

问题 您的程序永远不会退出while循环,因为您正在使用==运算符比较浮点数。这会导致计算错误,您可以阅读更多有关它的信息

解决方案 检查Qt中双变量相等性的正确方法是使用以下函数:

if (qFuzzyCompare(temp, n)) {
    break;
}
简化 如果正确理解任务,代码就太复杂了。这将完成整个工作:

double num = 0.12345;
if (num > 0 && num < 1) {
    QString str = QString::number(num).remove(0, 1);
    lineEdit->setText(str);
}

我很困惑是编译器本身,挂起定义挂起,还是您编译的代码?此外,与您的问题无关,但n=温度;iftemp==n中断;在一段时间内,循环将在第一次迭代时中断。我的意思是编译器挂起。因为n是int,temp是double,所以在第一次迭代中循环没有结束。哦,没有注意到变量的类型。很抱歉但您确实意识到,浮点数只是近似值,可能不会在您编写它们时准确地存储它们?另外:为什么解析算法如此困难?std::stringstream ss有什么问题;非常感谢。虽然您对double和int使用运算符==的看法不正确,但您的简化,尤其是.remove解决了这个问题。再次感谢。@franky很高兴知道现在一切正常。出于好奇,为什么您认为不使用==运算符比较浮点数的建议是错误的?这一经典问题被广泛讨论和描述,例如。