从文本文件C++读入时,数字的奇怪四舍五入

Strange rounding of numbers when reading in from text file C++

本文关键字:数字 四舍五入 文件 文本 C++      更新时间:2023-10-16

我有一个仅包含以下行的文本行。

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位?仅在显示到标准输出时执行此舍入吗?

EDIT:将建议的解决方案移至相关信息的顶部。

可以使用set::precision查看正确的精度

除了上面的答案,重要的是要注意,无论何时,您使用浮点数和十进制数舍入误差 &精度是一个确定的因素。

什么是精度错误?

浮点数的精度是指它能表示多少位而不丢失它所包含的任何信息。

考虑分数1/3。这个数的十进制表示是0.33333333333333…加上3直到无穷。无限长度的数字需要无限的内存才能精确地描述,但是floatdouble数据类型通常只有48字节。因此,浮点&双位数只能存储一定数量的数字,其余的数字必然会丢失。因此,没有明确准确的方法来表示浮点数或双精度数,这些数字要求的精度超过变量所能容纳的精度。

什么是舍入误差?

binarydecimal (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。这种情况称为舍入误差