[英]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
,因為double
到int
轉換會截斷該值,如果錯誤為負,則會產生不正確的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.