数字到qt的字符串转换

asi*_*hal 2 qt

我发现一些奇怪的数字(浮点数)到字符串转换..

这是示例代码.

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QString>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug()<<QString::number(50.5, 'f', 0);
    qDebug()<<QString::number(49.5, 'f', 0);

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

这里的输出是

Starting /home/asit/qt/qstring1-build-desktop/qstring1...
"50" 
"50"
Run Code Online (Sandbox Code Playgroud)

输出应该是51和50.有人能说出这个输出背后的原因是什么?

Blo*_*ood 7

浮点数的问题在于它们无法准确表示.所以49.5可能存储为略大于49.5的数字.这同样适用于50.5,但是这个可能存储为略小于50.5的数字.

这在Linux上曾经让我陷入困境,你尝试将双重转换为int.以此为例

double value = 0.3;
int result = static_cast<int> (value * 1000);
Run Code Online (Sandbox Code Playgroud)

在例如Solaris SPARC上,您将获得300个预期.使用Linux上的gcc,你得到299.为什么?好吧,尽管两者都通过向下舍入将double转换为int,但是在Linux上的gcc上,double被分配给FPU 80位寄存器,其中它由稍微小于0.3的数字表示.在Solaris(实际上大多数其他系统,包括VC++)中,double被分配给64位寄存器,其中它表示为略大于0.3.

如果你想确保你的数字四舍五入到正确的值,只需在转换前加0.5或使用qRound()来为你做出这一点.