C ++将字符串转换为float / double而不会丢失数据

时间:2013-06-24 13:43:15

标签: c++ string floating-point

我希望将字符串转换为浮点数而不丢失数据;例如,如果我使用istringstream或:: atof(x.c_str())我会因为四舍五入而丢失数据。

通常这对我来说不是问题,但我使用的数据必须与其读取相同。 这是一个数字的例子以及它转换成的数字。

-8.000001 -> -8
-0.6257381 -> -0.625738
12.0 -> 12 (drops the .0) 

如果有人能帮助我,我会非常感激

谢谢马特

3 个答案:

答案 0 :(得分:4)

您的问题有三个潜在问题:

  1. 显示的精确度。要控制使用的精确度,请添加#include <iomanip>并使用std::cout << std::setprecision(17);设置要使用的位数。

  2. 格式。如果想要“12.0”代表“12.0”,您应该知道“.0”未存储在floatdouble中。 double只包含值12;它不包含有关原始精度或错误间隔的任何信息。它正好是12而没有别的。如果您希望以特定方式格式化,则必须使用I / O流的格式标志或编写自己的代码来进行格式化。

  3. 精度。常见的floatdouble类型不能完全代表8.000001或0.6257381。它们使用二进制来表示浮点值,当十进制数字转换为二进制时会出现轻微的错误。如果您使用浮点数非常简单并且使用的数字明显少于floatdouble的限制,那么您可以忽略这一点,只需使用有限数量的数字格式化数字数字。如果超过简单的情况,则需要进行错误分析,这可能非常复杂。

答案 1 :(得分:1)

您将需要不同的数据类型。

浮点十进制类型允许您以您希望的方式存储数字。在这种类型中,数字存储为一对(尾数,指数),就像科学记数法一样,很像IEEE二进制浮点数。

您的示例将存储为

(-8000001, -6)
(-6257381, -7)
(120, -1)

例如,医疗设备通信的ISO 11073标准使用这种格式。

缺点是算术运算速度很慢,因为所有浮点运算硬件都设计为使用带有base-2的指数来处理数字。

答案 2 :(得分:0)

根据经验,float只能精确到6位有效数字。因此,如果您的字符串中有更多数字,那么您将达到精度限制。

double毫不奇怪地会给你这个精度的两倍;即12位重要数字。

有关进一步的评论,请参阅Number of significant digits for a floating point type