簡體   English   中英

C ++在int變量錯誤中存儲double

[英]C++ Store double in int variable error

這是一個小程序,用於計算“間隔”大小的間隙,這些間距在兩個數字之間,從'到'。 然后我計算'大小'(間隙數)並將其存儲在一個int變量中,有時給我一個較小的值。

這是代碼:

double from=0, to=1, interval=0.1;

cout << "WORKING WITH VARIABLES: " << endl;
double operation = (to-from)/interval +1;
cout << "Size: " << operation << endl;

int size = operation;

cout << "Size after storing: " << size << endl << endl;

cout << "WORKING WITHOUT VARIABLES: " << endl;
cout << "Size: " << (to-from)/interval +1 << endl;

size = (to-from)/interval +1;

cout << "Size after storing: " << size << endl << endl;

問題似乎在於它的存儲間隔。 如果interval = 1,一切都很好,但如果是0.1,那么在例子中它給我10而不是11在第二種情況下的“存儲后的大小”。

我發現它適用於interval = 0.25(2 ^ -2)。

編輯:我沒有發現它在第一種情況下失敗,總是在第二種情況下失敗。

浮點數以有限精度存儲,並以二進制形式存儲。 0.25很容易。 那只是1/4,所以0.01二進制。 0.1是1/10,不能用有限二進制串表示。 這是1/16 + 1/32 + ......

因此1/10向下舍入,10 * 1/10略小於1。

對於第一和第二種情況下,不同的結果,這可能是因為中間值四舍五入為位數多於double了。

您正在遭受浮點運算中固有的不准確性。 在0.1的情況下你可能得到的是10.999 ....而不是11.將double轉換為int truncates而不是舍入所以你得到10.在轉換為int之前添加一個小值來對抗它。

int size=operation+0.0000000001;

如果要將接近整數的double (由於舍入錯誤,如其他人所解釋的)轉換為int ,請始終將值舍入為最接近的整數,例如使用round() ,然后將值轉換為int ,因為doubleint轉換會截斷該值,如果錯誤為負,則會產生不正確的結果。

暫無
暫無

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

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