[英]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.