长字符串流 LibXML 字符串转换为浮点数添加不需要的数字

Long stringstream LibXML string convert to floating point numbers adds unwanted digits

提问人: 提问时间:9/27/2023 最后编辑:Hovercraft Full Of Eels 更新时间:10/3/2023 访问量:65

问:

如何修改以下代码等以产生所需的结果?

我有一个包含 400 多个浮点数的字符串,我一直试图将它们放入一个包含 400 个元素的浮点数组中。我不想使用 sscanf,因为我的语句会明确引用每个元素。

使用 stringstream,我可以更简洁地做到这一点,但我会得到额外的尾随数字。我也许可以使用位操作来删除不需要的数字。

下面是一个测试用例,希望能概括我正在尝试做的事情。

    #include <iostream>
    #include <sstream>
    #include <stdio.h>

    using namespace std;

    int main(){
      float a, b, c;
      std::string str = "123456.780 234567.8 345678.912";
      std::stringstream s(str);
      s.setf(std::ios::fixed);

      s.precision(2);
    
      s >> a >> b >> c;
      printf ("a = %f, b = %f, c = %f\n",a,b,c);

      return 0;
    }
    Output:
    a = 123456.781250, b = 234567.796875, c = 345678.906250

我尝试使用 setprecision、precision 和 width 但没有成功。

C++ 字符串流

评论

0赞 Vivick 9/28/2023
看起来这就是它们在IEEE754中的表现方式。成为是一个死的赠品.8.796[...]
0赞 Hovercraft Full Of Eels 10/3/2023
请不要污损您的问题,因为它只会给帮助维护网站的志愿者带来额外的不必要工作。

答:

1赞 Serge Ballesta 9/28/2023 #1

在 C 或 C++ 语言中,float 通常是 IEEE-754 binary32 格式,其尾数中只有 24 位,允许大约 7 个十进制数字(参考)。这意味着任何具有 8 位或更多数字的数字都可能显示错误的值。并且您希望在整数部分中有 6 位数字 + 小数部分中有 2 位数字 =>小数点后的第二个数字的值是错误的。

可以做些什么?

  • 如果您真的希望数字不进行任何修改并且不操纵它们,只需将它们保留为字符串即可
  • 如果希望能够在操作中使用该数字,并且希望保留至少 8 位有效数字,则必须使用 而不是doublefloat