我有一个带有数字读数的文件(例如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
如何获得存储的精确数字???
答案 0 :(得分:4)
读取或转换字符串时,不指定精度。而是在输出值时设置精度:
std::cout << std::setprecision(3) << 1.2345 << '\n';
以上将产生以下影响:
1.23
参见例如this reference
答案 1 :(得分:0)
确保您有double Array[][]
,而不是float
。文本表示(基数10)总是由二进制浮点数(基数2)近似,但是当使用相同的格式时,运气近似的atof数具有相同的表示。通常,一个人不会进行太多的计算,并且在输出中使用精确度或格式来降低精度。
答案 2 :(得分:0)
数字的每个浮点表示都具有有限的精度。特别地,float
对于其二进制尾数具有24位(1个固定+ 23变量),因此意味着大约七位小数的精度。
如果您需要更精确的存储号码,您可以考虑使用double
而不是float
。在普通PC上,double
对于二进制尾数有53位(1 + 52),因此允许15位十进制数字精度。
但请记住,输出这些数字时也存在问题。我认为printf
()和std::ostream
的默认精度只有6位数,包括float
和double
,除非另有说明。但是,在输出期间要求比数据类型提供的更高的精度没有意义。因此,即使您可以说printf("%0.30g", some_float)
,超出数据类型实际支持的七个数字的额外23位数可能不会真正产生有用的信息。