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

问题描述 投票:0回答:1

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

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

使用 stringstream,我可以做得更简洁,但我得到了额外的尾随数字。我也许可以使用位运算来删除不需要的数字。

下面是一个测试用例,希望能够概括我想要做的事情。

背景:我使用 LibXML 创建字符串,因为我的旧版本 g++ Boost 库不喜欢其中包含点的元素。

    #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

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

c++ stringstream
1个回答
0
投票

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

可以做什么?

  • 如果您确实希望保留数字而不进行任何修改并且不对其进行操作,只需将它们保留为字符串
  • 如果您希望能够在运算中使用该数字,并且希望保留至少 8 位有效数字,则必须使用
    double
    而不是
    float
© www.soinside.com 2019 - 2024. All rights reserved.