2016-12-23 57 views
0

我知道浮點類型是一個IEEE浮點,它不是計算的準確性,例如,如果我想總結兩個浮點數8.42.4,我得到的是10.7999999而不是10.8。我也知道BigDecimal可以解決這個問題,但BigDecimal比float類型慢得多。什麼時候應該在Java中使用float類型?

在最真實的作品,我們希望的精度值像上面10.8不是10.7999 ..所以我的問題是應避免使用浮動,就像我可以在編程?如果沒有,有沒有用例?我的意思是在實際生產中。

+0

[Double vs. BigDecimal?](http://stackoverflow.com/questions/3413448/double-vs-bigdecimal) –

+0

可能的重複你不應該因爲編程期望的內存限制而使用浮點數,使用floor和ceil來得到你的正確答案,如果你使用BigDecimal,它會減慢你的程序,如果你得到你正確的答案。 – Sahadev

+0

如果您想要精確度,請回答1dp或2dp – rafid059

回答

3

如果您要處理的是貨幣金額,那麼像8.42.4這樣的數字就是確切的數值,您需要爲這些數字使用BigDecimal。但是,如果您在處理測量時進行物理計算,則值8.4和2.4無論如何都不準確,因爲測量結果不準確。這是一個使用案例,使用double更好。另外,科學計算可能涉及諸如平方根,三角函數,對數等等,而這些只能使用IEEE浮點數來完成。涉及金錢的計算通常不涉及這些功能。

順便說一句,有很少的理由用不完float類型;堅持double

+1

測量結果是一個很好的原因。 – RobAu

+0

我不是處理貨幣金額,而是貨幣數量,這與貨幣數量一樣重要。所以在我的情況下,我必須改變爲BigDecimal,或者堅持使用你建議的'double',然後在最後舍入2位小數位? –

+1

取整浮點值是BAD決定。隱藏問題但不能解決。 –

1

當精確度足夠時,您使用float。用float進行計算通常會更快並且需要更少的內存。有時你只需要表現。

+0

float可能會比雙倍更快,可能在某些處理器上不會。同意,減少記憶。 –

1

你描述的是一個事實,即二進制浮點數字不能完全代表可以由十進制浮點數字,如8.4或2.4精確表示多的數字引起的。

這不僅影響了float類型在Java中也double

在許多情況下,您可以使用整數進行計算,然後重新調整以正確獲取分數。但是,如果你需要相等的相對應的數字,不管它們有多大,浮點數都是非常優越的。

所以,是的,如果你能,你應該更喜歡花車整數,但也有在需要浮點許多應用。這包括許多科學和數學算法。

你也應該考慮,在顯示時,但實際上差別是非常小的,而不是10.7999999 10.8看起來奇怪。所以這不是一個準確性問題,而是更多與數字格式相關。

String price = String.format("%.2f", floatPrice); 
+0

然後對我的情況有什麼建議,我正在處理一些數量(KG)計算,它對數量非常敏感,價格昂貴。改用BigDecimal? –

+0

@ Neeson.Z:不,您可能在這裏不需要BigDecimal。用'double'進行計算,然後適當地舍入結果,例如:'String price = String.format(「%。2f」,floatPrice);' –

0

BigDecimals是非常精確的( - 它主要是由內存的限制就可以決定其精度):在大多數情況下,這種問題是通過將其轉化時,一個輸出的字符串,例如適當地舍入數目解決但非常緩慢且內存密集。當您需要確切的結果時,即在財務應用程序中,或者您需要非常精確的結果以及速度不太重要時,您可以使用它們。

浮點類型(doublefloat)是不是幾乎一樣精確,但更快,他們只佔用有限的內存。通常,float佔用4個字節,並且double佔用8個字節。無論如何,您都可以使用它們進行測量,但如果您需要速度或內存,也可以使用它們。我將它們用於(實時)圖形和實時音樂。或者當結果的精確度不是那麼重要時,例如在下載或測量時測量時間或百分比。

相關問題