qt中的数字到字符串转换

qt中的数字到字符串转换,qt,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); qDe

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

下面是示例代码

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

输出应为51和50。有人能说出这个输出背后的原因吗?

浮点数的问题是它们不能被复制 准确地表示。因此,49.5可能存储为略大于49.5的数字。这同样适用于50.5,但这个可能存储为略小于50.5的数字

在Linux上,这曾经让我感到痛苦,在Linux上,您试图抛出一个 双精度转换为整数

double value = 0.3;
int result = static_cast<int> (value * 1000);
双值=0.3;
int结果=静态_转换(值*1000);
在例如Solaris SPARC上,您将获得预期的300。具有 在Linux上,你可以得到299。为什么?嗯,虽然两者都有 在gcc上,通过向下舍入将双精度转换为整数 Linux将双精度分配给FPU 80位寄存器 其中,它由一个略小于 0.3. 在Solaris上(事实上,大多数其他系统,包括 VC++)双精度被分配到64位寄存器 表示为略大于0.3


如果您想确保已将数字四舍五入到正确的值,只需在施法之前添加0.5或使用qRound()即可。输出正确。阅读手册,例如、和

您只是输出,而不是修改。如果要获取
int
数字,请将0.5 add cast添加到
int
,如:

...
int toInt(float x)
{
    return int(x+0.5);
}
...
qDebug()<<toInt(50.5);
qDebug()<<toInt(49.5);
。。。
int-toInt(浮点x)
{
返回整数(x+0.5);
}
...

qDebug()数字49.5和50.5在IEEE浮点中精确表示

但是IEEE浮点标准支持各种舍入算法。 除非您采取明确的步骤来控制使用哪种舍入算法, 您将获得您的环境选择作为默认值的任何算法

具体来说,您的环境似乎正在使用银行家舍入法。 当一个数字正好介于两个可能结果之间时, 银行家四舍五入将其四舍五入,使最后一个数字为偶数

因此,49.5轮对50轮。和50.5也轮到50

另请参见以下答案:

该文档没有解释四舍五入,这是lipun4u的问题所在。因为它根本没有四舍五入,所以也没有截断。如果输入49.5产生“50”(而不是“49”),我会说发生了一些舍入。这似乎不太可能是精度问题,因为这些数字(不同于0.1)以通常的浮点格式精确表示。事实上,我认为这是OP的底层软件如何对数字进行取整的一个特点。
...
int toInt(float x)
{
    return int(x+0.5);
}
...
qDebug()<<toInt(50.5);
qDebug()<<toInt(49.5);