2012-10-28 68 views
1

我試圖運行下面的代碼:損失精度

double f = 4.35; 
int n = (int) (100 * f); 

n434。爲什麼?

+8

[每個計算機科學家都應該知道的浮點算術](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。 – Oded

回答

2

4.35不能準確地表示爲浮動因爲0.35不是2的(負)冪。因此,這種或那種方式有一點舍入。當你乘以100時,可能還會有四捨五入的結果。如果結果數字少於435,則投射到int將佔據它的底部,即434.

如果您想輪到NEAREST integer,你可以在結果中加0.5,然後轉換爲int。這是對數字進行舍入的最普通的方式,儘管Java內置了四捨五入的實現。

double f = 4.35; 
int n = (int) (100 * f + 0.5); 
1

您需要觀看此視頻。我做了第一年的單身學生看作業。 http://vimeo.com/7403673 - Jon Skeet和託尼小馬。

喬恩斯基特的介紹在倫敦堆棧溢出DevDays事件:stackoverflow.carsonified.com

在6點50分左右,他談到了在Java中數學和所面臨的一些開發人員關於數學的共同問題。

+1

沒有某種總結就沒有答案。 –

+0

如果我沒有找到視頻如此有趣,我會低估你的答案:) – devsnd

0

這是因爲浮點數內部基2中表示,以免基部10

這這裏將幫助(必須導入Math):

double f = 4.35; 
long n = Math.round(100 * f);