0

我有一个存储十进制值的字符串,例如“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++ 编译器。会不会是这个编译器的错误导致了这个问题?如果是这样,还有其他方法可以将值转换为浮点数并获得正确的值吗?谢谢。

编辑:虽然这个问题对为什么会发生这种情况给出了部分解释,但它并没有给出完整的价值,它只提供了一个可能有效也可能无效的单一解决方案。因此,我认为将这个问题作为一个单独的问题开放是有效的。

4

1 回答 1

1

这不是转换活动的问题,而是浮点数的固有精度(或缺乏精度)。不同的编译器会有不同的精度。此外,随着您串行执行越来越多的数学运算,其中一个的输出是下一个的输入,精度会进一步降低。精度的缺乏来自于使用二进制(离散)数据来近似连续实数集中的值。

您可以选择使用“双精度”,传统上它的精度是浮点数的两倍。但是,一些现代编译器使用与浮点相同的“双精度”精度。

通过选择不同的编译器、不同的数据类型可以减少这个问题,但最终的问题仍然存在。

于 2014-05-29T21:33:57.503 回答