我希望将字符串转换为浮点数而不丢失数据;例如,如果我使用istringstream或:: atof(x.c_str())我会因为四舍五入而丢失数据。
通常这对我来说不是问题,但我使用的数据必须与其读取相同。 这是一个数字的例子以及它转换成的数字。
-8.000001 -> -8
-0.6257381 -> -0.625738
12.0 -> 12 (drops the .0)
如果有人能帮助我,我会非常感激
谢谢马特
答案 0 :(得分:4)
您的问题有三个潜在问题:
显示的精确度。要控制使用的精确度,请添加#include <iomanip>
并使用std::cout << std::setprecision(17);
设置要使用的位数。
格式。如果想要“12.0”代表“12.0”,您应该知道“.0”未存储在float
或double
中。 double
只包含值12;它不包含有关原始精度或错误间隔的任何信息。它正好是12而没有别的。如果您希望以特定方式格式化,则必须使用I / O流的格式标志或编写自己的代码来进行格式化。
精度。常见的float
和double
类型不能完全代表8.000001或0.6257381。它们使用二进制来表示浮点值,当十进制数字转换为二进制时会出现轻微的错误。如果您使用浮点数非常简单并且使用的数字明显少于float
和double
的限制,那么您可以忽略这一点,只需使用有限数量的数字格式化数字数字。如果超过简单的情况,则需要进行错误分析,这可能非常复杂。
答案 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。