C ++要精确浮动的字符串

时间:2013-07-04 12:28:43

标签: c++ string file

我有一个带有数字读数的文件(例如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

如何获得存储的精确数字???

3 个答案:

答案 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位数,包括floatdouble,除非另有说明。但是,在输出期间要求比数据类型提供的更高的精度没有意义。因此,即使您可以printf("%0.30g", some_float),超出数据类型实际支持的七个数字的额外23位数可能不会真正产生有用的信息。