C++ 字符串精确浮动

Posted

技术标签:

【中文标题】C++ 字符串精确浮动【英文标题】:C++ String to float with precision 【发布时间】:2013-07-04 12:28:43 【问题描述】:

我有一个包含数字读数的文件(例如 5.513208E-05 / 1.146383E-05) 我读取文件并将条目存储在临时字符串中。 之后,我将临时字符串转换为浮点变量(我将其存储在多维数组中)。 我使用下面的代码进行转换。

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

我怎样才能得到存储的精确数字???

【问题讨论】:

Array的变量类型是什么?如果它是浮动的,请尝试将其更改为双精度。 嗯,float 会给你大约 log10(2^23) 位,即“6.92”,所以介于 6 到 7 位之间。 点击此链接可能会对您有所帮助***.com/questions/10605653/… 浮点数不精确。在 32 位系统上,float 的 6 个有效数字的精度是正常的。 【参考方案1】:

读取或转换字符串时不指定精度。相反,您在输出值时设置精度:

std::cout << std::setprecision(3) << 1.2345 << '\n';

以上将产生以下输出:

1.23

参见例如this reference.

【讨论】:

谢谢...精度很好,是 cout 将其四舍五入【参考方案2】:

确保您拥有double Array[][],而不是float。文本表示(以 10 为基数)始终由二进制浮点数(以 2 为基数)近似,但幸运的是,当使用相同格式时,atof 的近似数具有相同的表示。一般来说,不会做太多计算,并且在输出时使用 setprecision 或格式降低精度。

【讨论】:

【参考方案3】:

数字的每个浮点表示都具有有限的精度。特别是,float 的二进制尾数有 24 位(1 个固定+23 变量),因此意味着大约 7 个十进制数字的精度。

如果您需要更精确的存储数字,您可能希望考虑使用double 而不是float。在普通 PC 上,double 的二进制尾数有 53 位 (1+52),因此允许 15 位十进制数字精度。

但是请记住,输出这些数字时也会出现问题。我认为printf() 和std::ostream 的默认精度只有6 位,floatdouble,除非您另有说明。但是,在输出过程中要求比数据类型提供的精度更高是没有意义的。因此,即使您可以printf("%0.30g", some_float),数据类型实际支持的7 位之外的额外23 位可能不会真正产生有用的信息。

【讨论】:

以上是关于C++ 字符串精确浮动的主要内容,如果未能解决你的问题,请参考以下文章

在c ++中逐个字符从字符串传递到int时不精确

python boto的Decimal上下文的猴子补丁,允许浮动的不精确和圆形表示。用于在运行时存储DynamoDB中的任何浮动

C++ - 字符串是不是包含一个单词 - 带有简单循环?

带有负浮动的字符串浮动? [复制]

从 EditText 到浮动的字符串

使用往返浮动到字符串