在使用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 ...