qDebug 浮點輸出問題

2021-08-17 23:08:58 字數 2231 閱讀 9278

在使用qt時,通過qdebug()輸出浮點數時有機會遇到乙個細微錯誤。 問題在於顯示的可能並不完整。std::cout有相同的問題。

情況可能發生在以下情況:

您有乙個qstring物件,它包含一定數量的8564.26495574,我們使用todouble()方法將其轉換為浮點數,然後用輸出qdebug()檢查結果,但是運氣不好,輸出不正確。

qstring str("8564.26495574");

qdebug() << str.todouble();

// 輸出 -> 8564.26

但實際上我們有絕對正確的數字,也就是從字串中得到的數字8564.26495574,但qdebug()顯示了捨入結果。

如果您嘗試為qdebug()使用double,則會觀察到同樣的情況。

double a = 8564.26495574;

qdebug() << a;

// 輸出 -> 8564.26

使用bool變數確保將數字從qstring轉換為double時沒有發生錯誤,該變數是作為todouble()方法引數傳遞的指標。

qstring str("8564.26495574");

bool ok = false;

qdebug() << str.todouble(&ok);

qdebug() << ok;

// 我們將得到如下輸出

// 8564.26

// true - 也就是說轉換成功,那麼問題不在轉換這步。

為了做出正確的輸出,我們必須使用qstring::arg()方法來指示格式化和精確化的型別。

qstring str("8564.26495574");

double a = 8564.26495574

;double b = str.todouble();

qdebug() << qstring("%1").arg(a, 0, 'f', 5);

qdebug() << qstring("%1").arg(a, 0, 'g', 5);

qdebug() << qstring("%1").arg(a, 0, 'e', 10);

qdebug() << qstring("%1").arg(a, 0, 'g', 30);

qdebug() << qstring("%1").arg(b, 0, 'f', 5);

qdebug() << qstring("%1").arg(b, 0, 'g', 5);

qdebug() << qstring("%1").arg(b, 0, 'e', 10);

qdebug() << qstring("%1").arg(b, 0, 'g', 30);

我們將得到如下輸出

"8564.26496"

"8564.3"

"8.5642649557e+3"

"8564.26495574000000488013029099"

"8564.26496"

"8564.3"

"8.5642649557e+3"

"8564.26495574000000488013029099"

在這兩種情況下,我們都可以得到與這裡相同的結果,並且這裡的數字是相同的。

關於格式化的引數(qt文件中有詳細介紹):

eformat as [-]9.9e[+|-]999

eformat as [-]9.9e[+|-]999

fformat as [-]9.9

guse e or f format, whichever is the most concise

guse e or f format, whichever is the most concise

正如您在輸出中看到的那樣,輸出8564.26495574000000488013029099有點不正確。 這與計算機背後如何儲存浮點數有關。任何計算機中位數的容量都是有限的,因此在最後一位小數字發生四捨五入,這會導致出現此現象。 精確計算時應考慮這一點。

浮點數的儲存及輸出問題

main 如果不執行上面的 讓我們來直接判斷,輸出的結果會是什麼?而在你執行程式之後,結果卻很讓人詫異 123.456001 為什麼會是 123.456001 有六位小數可以理解,最後那個 1是為何?有很多人解釋說最後那個 1是亂碼,隨機的。嘿嘿 其實無論你執行它多少次,最後始終都跟著乙個 1。這最...

逆序輸出問題

一,題目 輸入乙個鍊錶的頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下 struct listnode 二,分析 解法二 從頭到尾遍歷鍊錶,每經過乙個結點的時候,把該結點放到乙個棧中。當遍歷完整個鍊錶後,再從棧頂開始輸出結點的值,此時輸出的結點的順序已經反轉過來了。該方法需要維護乙個額外的...

php輸出問題

輸出問題 a a3df b 256 echo a echo print a echo printf a s,b d a b echo 輸出問題,一般情況用echo 它可以連續輸出,如 echo a b sffjfh echo print的輸出有返回值 print是函式 return print b ...