[英]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.