[英]C++ String to float with precision
我有一個帶有數字讀數的文件(例如5.513208E-05 / 1.146383E-05)我讀取文件並將條目存儲在一個臨時字符串中。 之后我將臨時字符串轉換為float變量(我存儲在多維數組中)。 我使用下面的代碼進行轉換。
getline(infile, temporary_string, ',');
Array[i][0] = ::atof(temporary_string.c_str());
getline(infile, temporary_string);
Array[i][1] = ::atof(temporary_string.c_str());
問題是當我將花車打印到屏幕上時
5.51321e-05 1.14638e-05代替5.513208E-05 1.146383E-05
如何獲得存儲的精確數字???
讀取或轉換字符串時,不指定精度。 而是在輸出值時設置精度:
std::cout << std::setprecision(3) << 1.2345 << '\n';
以上將產生以下oputput:
1.23
參見例如此參考文獻 。
確保你有double Array[][]
,而不是float
。 文本表示(基數10)總是由二進制浮點數(基數2)近似,但是當使用相同的格式時,運氣近似的atof數具有相同的表示。 通常,一個人不會進行太多計算,並且在輸出中使用精確度或格式的精度降低。
數字的每個浮點表示都具有有限的精度。 特別是, float
的二進制尾數有24位(1個固定+ 23個變量),因此意味着大約七位小數的精度。
如果存儲的數字需要更高的精度,您可能希望考慮使用double
而不是float
。 在普通PC上, double
對於二進制尾數有53位(1 + 52),因此允許15位十進制數字精度。
但請記住,輸出這些數字時也存在問題。 我認為printf
()和std::ostream
的默認精度只有6位數,包括float
和double
,除非另有說明。 但是,在輸出期間要求比數據類型提供的更高的精度沒有意義。 say printf("%0.30g", some_float)
, the extra 23 digits beyond the seven actually supported by the data type might not really produce useful information. 因此,即使您說printf("%0.30g", some_float)
,超出數據類型實際支持的七個數字的額外23位數可能不會真正產生有用的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.