c++ - 使用 atof 将字符串转换为 float 在末尾产生非常小的十进制数

标签 c++ decimal precision atof

<分区>

我有一个存储十进制值的字符串,例如“0.10”。我想将其转换为 float 。但是当我用atof来做的时候,得到的数字并不完全是它应该有的值。我正在编写一些涉及十进制值的一些数字运算的复杂算法,所以这会影响我的最终结果。

这是描述我遇到的问题的一些简单代码。这里我只是简单的把一个十进制值放到一个字符串中,用atof转成float,用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++ 编译器。可能是这个编译器的错误导致了这个问题吗?如果是这样,是否有任何其他方法可以将值转换为 float 并获得正确的值?谢谢。

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

最佳答案

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

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

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

关于c++ - 使用 atof 将字符串转换为 float 在末尾产生非常小的十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23943159/

相关文章:

java - 在Java android中使用Math.round方法四舍五入到小数点后6位

python-3.x - Python 3 数组平均值计算

c++ - 尝试查找数组中点之间的最小距离时随机垃圾输出

c++ - 如何找到两个日期之间以秒和纳秒为单位的时间差?

c# - 带有十进制数字的蒙面文本框

c# - 是否有没有舍入误差的数学除法方法?

c++ - 模板类的工厂方法

c++ - unixODBC C++ 文档...?

wolfram-mathematica - Mathematica 精度不同于其他计算器

Python 3.3.5 浮点格式精度