簡體   English   中英

C ++將字符串轉換為浮點/雙精度而不丟失數據

[英]C++ converting string to float/double without loss of data

我正在尋找一個字符串轉換為浮點數而不會丟失數據的方法。 例如,如果我使用istringstream或:: atof(x.c_str()),則由於四舍五入而丟失了數據。

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

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

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

謝謝馬特

您的問題中存在三個潛在問題:

  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的限制少得多,那么您可以忽略這一點,而僅用有限的位數來格式化數字。 如果超出簡單的情況,則需要進行錯誤分析,這可能會非常復雜。

您將需要其他數據類型。

浮點十進制類型將使您可以完全按照所需的方式存儲數字。 在這種類型中,數字以成對的方式(尾數,指數)存儲,就像科學計數法和IEEE二進制浮點數一樣。

您的示例將存儲為

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

例如,用於醫療設備通信的ISO 11073標准使用了這種格式。

缺點是算術會相當慢,因為所有浮點算術硬件都設計為使用以base-2為指數的數字。

根據經驗, float只能精確到6位有效數字。 因此,如果您的字符串中包含更多數字,則會達到精度極限。

一個double會給你,這並不奇怪,關於這雙精度; 即12位有效數字。

有關更多說明,請參見浮點類型的有效位數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM