我发现一些奇怪的数字(浮动)到字符串转换..
以下是示例代码。
#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();
}
这里的输出是
Starting /home/asit/qt/qstring1-build-desktop/qstring1...
"50"
"50"
输出应该是51和50.有人可以说出这个输出背后的原因是什么?
答案 0 :(得分:7)
浮点数的问题在于它们不可能 完全代表。所以49.5可能存储为略大于49.5的数字。这同样适用于50.5,但这个可能存储为略小于50.5的数字。
之前在Linux上尝试过投了一个 加倍到一个int。举个例子。
double value = 0.3;
int result = static_cast<int> (value * 1000);
例如,在Solaris SPARC上,您将获得300个预期效果。同 Linux上的gcc你得到299.为什么?好吧,虽然两者都有 通过在gcc上向下舍入,将double转换为int Linux将double分配给FPU 80位寄存器 它由一个略小于的数字表示 0.3。在Solaris上(事实上大多数其他系统,包括 VC ++)double被分配给64位寄存器 它表示为略大于0.3。
如果您想确保将数字四舍五入为正确值,只需在投射前添加0.5或使用qRound(),这样就可以实现这一目标。
答案 1 :(得分:0)
输出正确。阅读手册,例如QString Class Reference和Argument Formats。
您只是输出,但不能修改。如果您想获得int
个数字,请在int
添加0.5添加广告,例如:
...
int toInt(float x)
{
return int(x+0.5);
}
...
qDebug()<<toInt(50.5);
qDebug()<<toInt(49.5);