提问人: 提问时间:9/27/2023 最后编辑:Hovercraft Full Of Eels 更新时间:10/3/2023 访问量:65
长字符串流 LibXML 字符串转换为浮点数添加不需要的数字
Long stringstream LibXML string convert to floating point numbers adds unwanted digits
问:
如何修改以下代码等以产生所需的结果?
我有一个包含 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 但没有成功。
答:
1赞
Serge Ballesta
9/28/2023
#1
在 C 或 C++ 语言中,float 通常是 IEEE-754 binary32 格式,其尾数中只有 24 位,允许大约 7 个十进制数字(参考)。这意味着任何具有 8 位或更多数字的数字都可能显示错误的值。并且您希望在整数部分中有 6 位数字 + 小数部分中有 2 位数字 =>小数点后的第二个数字的值是错误的。
可以做些什么?
- 如果您真的希望数字不进行任何修改并且不操纵它们,只需将它们保留为字符串即可
- 如果希望能够在操作中使用该数字,并且希望保留至少 8 位有效数字,则必须使用 而不是
double
float
评论
.8
.796[...]