2011-04-18 67 views
1

我有下面的代碼,我想分配一個十進制值來浮動而不會失去精度。從字符串分配到精度浮點數

String s1= "525.880005"; 
Float f = new Float(s1); 
System.out.println(f); 

輸出: 5.88

預期輸出: 525.880005

+0

如果使用.parseFloat()方法會發生什麼? – reporter 2011-04-18 14:16:02

+0

@reporter:他實際上是。 'Float'構造函數和'parseFloat'都使用'Float.valueOf(String)'執行的轉換。所以這是相同的轉換。更多信息:http://download.oracle.com/javase/6/docs/api/java/lang/Float.html – 2011-04-18 14:20:58

回答

5

Float只具有精度7-8顯著數字。你例子中的「5」是第9位數字。

即使它有足夠的精度,我也不知道525.880005是否可以完全表示爲二進制浮點數。大多數小數值不是:)

如果確切的十進制表示對您很重要,您應該使用BigDecimal

1

float類型不能容納所有可能的值(也不可能double)。如果您使用字符串進行分配,您可能更願意使用BigDecimal,因爲BigDecimal可以精確地容納任何可以用字符串合理表示的內容。

注意BigDecimal並不都可能值(它不能準確地代表1/3,例如,出於同樣的原因,我們不能在我們的十進制表示系統 寫1/3 正是它不會結束)。但是,如果您的來源是字符串值,則BigDecimal將與您的可能值更接近,比floatdouble更符合您的來源。當然,這是一個成本。 floatdouble被設計爲計算速度非常快; BigDecimal被設計成十分精確的十進制值,代價是速度。

0

Float沒有足夠的有效數字來表示您的號碼。嘗試Double

2

有沒有在這個問題隱含一個真正的矛盾:

分配浮動< - >室內用精密

525.880005是絕對在這個浮動域最接近525.88數量。

浮動數字無法映射到所有數字的原因是因爲小數與二進制系統之間的不匹配。

其他類型,如十進制和金錢,使用其他更多的內存消耗技術來存儲數字(例如,在字符串中可以存儲任何數字,但當然這不是最高性能的方式做數學)

一個簡單的例子:0.3在我自己的二進制系統:

0.1b (inary) would be 0.5 d (ecimal) so too much... 
0.01b --> 0.25d (1/4 too little) 
0.011 --> 0.375 (1/4 + 1/8 too much) 
0.0101 --> 0.3125 (1/4 + 1/16 still too much) 
... 
0.010011 --> 1/4 +1/32 + 1/64 = 0.296875 

假設我的系統具有6個位來表示分數,0。296875將是這個域名最接近的。由於十進制/二進制系統無法達到正確的編號。

有關示例見: Floating point inaccuracy examples

而且你的問題一個很好的精心explenation是在這裏找到: http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

另注:這是真正關心的失配,而不是關於「質量」系統:例如,用十進制表示法,不能將1/3表示爲100%準確,而在其他系統中這是完全可能的。