我有一个存储十进制值的字符串,例如" 0.10"。我想将其转换为浮点数。但是当我使用atof来做它时,我得到的数字并不完全是应该的值。我正在编写一些复杂的算法,涉及一些数字运算的十进制值,所以这会把我的最终结果抛弃。
以下是一些描述我遇到的问题的简单代码。在这里,我只是将一个十进制值放入一个字符串中,将其转换为带有atof的浮点数,然后用cout打印出来。我得到的结果表明atof正在为最终值添加一个小的十进制数。
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main()
{
string value = "0.10";
float valueAsFloat = atof(value.c_str());
cout.precision(20);
cout << valueAsFloat << endl;
return 0;
}
输出结果为:
0.10000000149011611938
有什么想法吗?我在Ubuntu上使用GNU g ++编译器。可能是这个编译器的错误造成了这个问题吗?如果是这样,有没有其他方法将值转换为浮点数并获得正确的值?感谢。
编辑虽然这个问题可以解释为什么会发生这种情况,但它并没有提供完整的价值,而且它只提供了一个可能有效或无效的解决方案。因此,我认为将这个问题作为一个单独的问题保持开放是有效的。
答案 0 :(得分:1)
这不是转换活动的问题,而是浮动的固有精度(或精度不足)。不同的编译器会有不同的精度。此外,当您以串行方式执行越来越多的数学运算时,其中一个输出是下一个的输入,精度会进一步受到侵蚀。缺乏精确性来自于使用二进制(离散)数据来近似连续实数集中的值。
您可以选择使用&#34; double&#34;相反,传统上它具有浮动精度的两倍。但是,一些现代编译器使用相同的精度来实现&#34; double&#34;作为浮动。
通过选择不同的编译器,不同的数据类型可以减少这个问题,但最终的问题仍然存在。