2013-06-24 138 views
-2

我正在尋找將字符串轉換爲數據丟失的float;例如,如果我使用istringstream或:: atof(x.c_str()),由於四捨五入,我猜數據丟失。C++將字符串轉換爲float/double而不丟失數據

通常這對我來說不是問題,但我使用的數據必須與其讀取的數據相同。 下面是一個數字及其轉換成的例子。

-8.000001 -> -8 
-0.6257381 -> -0.625738 
12.0 -> 12 (drops the .0) 

如果有人可以幫助我,我會非常感激

感謝馬特

+5

你確定你不只是以較低的精度印刷它們嗎?我建議使用一些東西來轉換其錯誤不是一個有效的結果。 – chris

+5

一般來說,這是不可能的,因爲由於浮點/雙精度有限的位數,您總是會舍入誤差。此外,Base 10中的舍入誤差與Base 2中的不同。此外,12.0與二進制表示中的12是相同的,因此它們之間不能有差異 – bennofs

+0

想一想您的權利Bennofs – Makka

回答

4

有你的問題三個潛在的問題:

  1. 顯示的精度量。要控制使用的精度,請包括#include <iomanip>並使用std::cout << std::setprecision(17);來設置要使用的位數。

  2. 格式。在「12.0」爲「12.0」的情況下,您應該知道「.0」未存儲在floatdouble中。 double只包含值12;它不包含有關原始精度或錯誤間隔的任何信息。這完全是12,沒有別的。如果您希望以特定方式格式化,則必須使用I/O流的格式標誌或編寫自己的代碼來執行格式化。

  3. 準確性。常見的floatdouble類型不能完全表示8.000001或0.6257381。它們使用二進制來表示浮點值,並且在將十進制數字轉換爲二進制時會出現輕微錯誤。如果你有非常簡單的浮點使用方法,並且使用的數字比floatdouble的限制少得多,那麼你可能會忽略這一點,並簡單地用有限的數字來格式化數字。如果你超過了簡單的情況,你需要做錯誤分析,這可能很複雜。

0

作爲一個經驗法則,一個float只精確到6個顯著數字。所以如果你的字符串有更多的數字,你會達到精度限制。

A double不會讓人意外的是,這個精度會提高一倍;即12位有效數字。

請參閱Number of significant digits for a floating point type作進一步的評論。

+0

我認爲這可能是問題,但我檢查了它在網上,並得出結論,我使用的雙倍應該沒問題,我認爲這只是C++舍入問題,無法解決:/ – Makka

+0

哦,如果你使用一個雙重的,那麼其他東西肯定是錯誤的。我會研究印刷精度;請參閱@chris的評論。 – Bathsheba

1

你將需要一個不同的數據類型。

浮點十進制類型將允許您按照自己想要的方式存儲數字。在這種類型中,數字被存儲爲一對(尾數,指數),就像科學記數法一樣,很像IEEE二進制浮點數。

你的例子將被存儲爲

(-8000001, -6) 
(-6257381, -7) 
(120, -1) 

例如,對於醫療設備通信的ISO 11073標準使用這樣的格式。

不足之處在於算術運算速度很慢,因爲所有的浮點算術硬件都設計爲使用基數爲2的指數來處理數字。

相關問題