[英]Strange rounding of numbers when reading in from text file C++
我有一个只包含以下行的文本行。
0.01180994648909809 0.0118339243907452 0.01153905217670122
0.0376759911531237 0.03771224865527065 0.03765957194275842
我使用以下代码读取此数据并将其输出到终端
using namespace std;
int main(int argc, char *argv[])
{
ifstream infile(argv[1]);
string line;
double a,b,c;
while(getline(infile,line))
{
istringstream iss(line);
iss >> a >> b >> c;
cout<<a<<"\t"<< b << "\t"<<c<<endl;
}
return 0;}
我得到的输出是
0.0118099 0.0118339 0.0115391
0.037676 0.0377122 0.0376596
为什么在输出中数字已经舍入到小数点后的7位数? 这种舍入仅在显示标准输出时执行吗?
编辑:在相关信息的顶部移动建议的解决方案。
您可以使用set :: precision查看正确的精度。
除了上面的答案,重要的是要注意,无论何时,你使用浮点数和十进制数舍入误差和精度是一个明确的因素。
什么是精度误差?
浮点数的精度是它可以表示的位数,而不会丢失它包含的任何信息。
考虑1/3
的分数。 这个数字的十进制表示是0.33333333333333…
其中3表示无穷大。 无限长度数将要求以精确精度描绘无限存储器,但float
或double
数据类型通常仅具有4
或8
个字节。 因此,浮点数和双数字只能存储一定数量的数字,其余数字必然会丢失。 因此,没有明确准确的方法来表示浮点数或双数字,其数字需要比变量可以容纳更多的精度。
什么是舍入误差?
binary
和decimal (base 10)
之间存在非明显差异。
考虑1/10
的分数。 在decimal
,这可以很容易地表示为0.1
,并且0.1
可以被认为是易于表示的数字。 但是,在二进制中, 0.1
由无限序列表示: 0.00011001100110011…
一个例子:
#include <iomanip>
int main()
{
using namespace std;
cout << setprecision(17);
double dValue = 0.1;
cout << dValue << endl;
}
这个输出是:
0.10000000000000001
并不是
0.1.
这是因为双重必须截断近似值,因为它的内存有限,导致数字不完全0.1
。 这种情况称为舍入误差 。
因此,在使用floar或double时请注意这些错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.