簡體   English   中英

從文本文件C ++讀入時奇怪的數字舍入

[英]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表示無窮大。 無限長度數將要求以精確精度描繪無限存儲器,但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 這種情況稱為舍入誤差

因此,在使用floar或double時請注意這些錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM