我发现一些奇怪的数字(浮点数)到字符串转换..
这是示例代码.
#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.有人能说出这个输出背后的原因是什么?
浮点数的问题在于它们无法准确表示.所以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()来为你做出这一点.
| 归档时间: |
|
| 查看次数: |
6468 次 |
| 最近记录: |