0

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

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

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

如果有人可以帮助我,我将不胜感激

谢谢马特

4

3 回答 3

5

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

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

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

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

于 2013-06-24T14:07:02.647 回答
1

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

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

您的示例将存储为

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

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

缺点是算术会很慢,因为所有浮点算术硬件都设计为使用以 2 为底的指数处理数字。

于 2013-06-24T14:13:05.580 回答
0

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

毫不奇怪, Adouble会给你大约两倍的精度;即12位有效数字。

有关更多说明,请参阅浮点类型的有效位数

于 2013-06-24T13:46:41.827 回答