3

数値(浮動小数点数)から文字列への変換で奇妙なことがわかりました..

これがサンプルコードです。

#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 になるはずです。誰かがこの出力の背後にある理由を教えてもらえますか?

4

3 に答える 3

7

浮動小数点数の問題は、正確に表現できないことです。したがって、49.5 は 49.5 よりもわずかに大きい数値として格納される場合があります。同じことが 50.5 にも当てはまりますが、これは 50.5 よりもわずかに小さい数値として格納される場合があります。

これは、double を int にキャストしようとする Linux で以前に私を噛んだことがあります。例えば取る

double value = 0.3;
int result = static_cast<int> (value * 1000);

たとえば、Solaris SPARC では、予想どおり 300 になります。Linux で gcc を使用すると 299 になります。なぜですか? どちらも double を切り捨てて int に変換しますが、Linux の gcc では double は FPU 80 ビット レジスタに割り当てられ、0.3 よりわずかに小さい数値で表されます。Solaris (および実際には VC++ を含む他のほとんどのシステム) では、double は 64 ビット レジスタに割り当てられ、0.3 よりわずかに大きいものとして表されます。

数値を正しい値に丸めたことを確認したい場合は、キャストする前に 0.5 を追加するか、qRound() を使用してください。

于 2013-02-11T15:19:24.567 に答える
0

出力は正しいです。QString Class ReferenceArgument Formatsなどのマニュアルを読んでください 。

出力するだけで、変更はしません。数値を取得したい場合は、次のようintに 0.5 add cast を追加します。int

...
int toInt(float x)
{
    return int(x+0.5);
}
...
qDebug()<<toInt(50.5);
qDebug()<<toInt(49.5);
于 2013-02-11T15:27:43.757 に答える