我有以下的情況,讓我27,而不是28:轉換雙爲int誤差(1個關)
double d = 0.35;
int i = 80;
int ans = (int)(d * i);
printf("%d", ans);
但我得到正確的答案,如果我用這個:
int ans = (int)(0.35 * 80);
printf("%d", ans);
或:
double ans = d * i;
printf("%d", (int) ans);
有人可以解釋爲什麼第一種情況是1個關和其他人的工作?
我做了一些研究和人說雙存儲數字,如28 27.999 ...,但我很困惑,在什麼情況下,這會發生。Britain
謝謝!
你的問題是關於C,而不是C++。至於問題本身,我無法重現你的問題。在gcc(Ubuntu 4.8.1-2ubuntu1〜12.04)上的所有三種情況下,我得到了28分。 – DyZ
[我嘗試在ideone中,它返回28](https://ideone.com/6J4yMm)。你使用的是什麼編譯器和平臺? – AntonH
有幫助的閱讀:[每個計算機科學家應該知道的關於浮點運算的內容](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – user4581301