1

我正在使用Java 7 64位的LibGDX程序。爲什麼java 7 123.123456f會得到123.12346?

當我使用junit測試一個接收float作爲參數的函數時,我得到了一個奇怪的結果。我使用123.123456f作爲參數調用該函數,該函數接收123.12346。爲什麼會發生?

當我使用12.123456f作爲參數時,它得到了正確的結果。 123.12345f仍然有效。

因此我使用System.out.println(...)來檢查輸入。

這對我並不重要,但我只是想知道爲什麼。非常感謝你!

問候, 安東尼

+1

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

+0

已經有很多關於這個「問題「在這個網站上。浮點類型不具有無限精度。浮游物有24位尾數,只能保持6-7位精度 –

回答

3

f裝置float這意味着單精度IEEE-754浮點數。他們不是很精確,他們只有大約七位有效數字。對於double,您可以使用d來加倍(!),這是一個雙精度浮點數,它提供大約15位的精度。當然,只要你通過這個接受double s而不僅僅是float s。如果它需要任何合理的精度,應該。

請注意,即使雙打也有問題;他們有更大的精度,不完美的精度。 IEEE-754浮點設計用於快速計算和緊湊型存儲。典型的不精確的例子,即使是雙打,是0.1 + 0.2,它出來作爲0.30000000000000004

如果你正在處理貨幣數字(我認爲,與該圖書館,你不是),你可能會看到BigDecimal,它更像我們以前工作,與任意數字的數字。他們更大更慢,並且有他們自己的問題(如他們無法準確表示1/3),但對於貨幣他們可以是更好的選擇。

+0

你的答案聽起來像浮游物是無用的,雙打將解決所有問題。通常花車是完全不夠的,如果你想要精確的值,那麼雙打會遇到同樣的問題,稍後會出現。您至少應該在答案中向BigDecimals添加提示。 – noone

+0

@noone:'BigDecimal'當然有自己的問題,比如試圖準確地表示'1/3'。 :-)我不認爲我說雙打解決了所有問題,遠非如此。但他們比單打更精確。 –

相關問題