2013-02-11 253 views
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(); 
} 

這裏輸出

Starting /home/asit/qt/qstring1-build-desktop/qstring1... 
"50" 
"50" 

輸出應該是51和50。有誰能告訴這是什麼輸出背後的原因是什麼?

回答

7

浮點數的問題是它們不能完全代表 。所以49.5可能會被存儲爲略多於49.5的數字。這同樣適用於50.5,但這個可能存儲爲略小於50.5的數字。

這讓我在Linux上咬了一口之前,你試着把一個 double加到int上。以例如

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(),這將爲你做。

0

輸出正確。閱讀手冊,例如QString Class ReferenceArgument Formats

你只是輸出,但不能修改。如果你想獲得int號碼,添加0.5新增Cast至int,如:

... 
int toInt(float x) 
{ 
    return int(x+0.5); 
} 
... 
qDebug()<<toInt(50.5); 
qDebug()<<toInt(49.5); 
+3

這些文檔不解釋倒圓,這是lipun4u的問題點。 – 2013-02-11 15:58:24

+0

因爲它根本不是圓的所以 – troyane 2013-02-11 16:04:09

+0

好吧,它也不會截斷。如果輸入49.5產生「50」(而不是「49」),我會說有一些舍入正在發生。 – 2013-02-11 16:08:36