我希望在不丢失数据的情况下将字符串转换为浮点数;例如,如果我使用 istringstream 或 ::atof(x.c_str()) 我猜我会因为四舍五入而丢失数据。
通常这对我来说不是问题,但我使用的数据必须与其读取的数据相同。这是一个数字及其转换为的示例。
-8.000001 -> -8
-0.6257381 -> -0.625738
12.0 -> 12 (drops the .0)
如果有人可以帮助我,我将不胜感激
谢谢马特
我希望在不丢失数据的情况下将字符串转换为浮点数;例如,如果我使用 istringstream 或 ::atof(x.c_str()) 我猜我会因为四舍五入而丢失数据。
通常这对我来说不是问题,但我使用的数据必须与其读取的数据相同。这是一个数字及其转换为的示例。
-8.000001 -> -8
-0.6257381 -> -0.625738
12.0 -> 12 (drops the .0)
如果有人可以帮助我,我将不胜感激
谢谢马特
您的问题存在三个潜在问题:
显示的精度量。要控制使用的精度,请包含#include <iomanip>
并使用std::cout << std::setprecision(17);
来设置要使用的位数。
格式化。如果想要“12.0”作为“12.0”,您应该知道“.0”不存储在 afloat
或double
中。double
仅包含值 12 ;它不包含有关原始精度或错误间隔的任何信息。正好是 12 点,仅此而已。如果您希望以特定方式对其进行格式化,则必须使用 I/O 流的格式标志或编写自己的代码来进行格式化。
准确性。commonfloat
和double
类型不能准确表示 8.000001 或 0.6257381。它们使用二进制来表示浮点值,十进制数字转换为二进制时会有轻微的错误。如果您对浮点数的使用非常简单,并且使用的位数明显少于 and 的限制float
,double
那么您可能可以忽略这一点,并使用有限的位数简单地格式化数字。如果超出简单情况,则需要进行错误分析,这可能非常复杂。
您将需要不同的数据类型。
浮点十进制类型将允许您以您想要的方式存储数字。在这种类型中,数字存储为一对(尾数,指数),就像科学记数法和 IEEE 二进制浮点一样。
您的示例将存储为
(-8000001, -6)
(-6257381, -7)
(120, -1)
例如,用于医疗设备通信的 ISO 11073 标准就使用了这种格式。
缺点是算术会很慢,因为所有浮点算术硬件都设计为使用以 2 为底的指数处理数字。
根据经验,afloat
仅精确到 6 位有效数字。因此,如果您的字符串中有更多数字,您将达到精度限制。
毫不奇怪, Adouble
会给你大约两倍的精度;即12位有效数字。
有关更多说明,请参阅浮点类型的有效位数。