2013-04-15 22 views
0

默認的Java String.format默認將浮點值舍入爲6位數,這可以通過使用格式字符串中的格式說明符來覆蓋。自定義Java Formater以保留計算機Precission

如何創建一個Formater實例,該實例默認情況下會打印float或double的完整機器精度以進行格式化,但保留在格式字符串中指定較低精度的功能。

爲了舉例說明,下面的代碼

String.format("%f",1.23456789) 

回報

1.234568 

我想創建一個自定義的格式化裝置,使

MyFormater.format("%f",1.23456789) 

回報

1.23456789 

同時產生相同的輸出來的String.format如果格式字符串爲 「%.2f」

String.format("%.2f",1.23456789).equals(MyFormater.format("%.2f",1.23456789)) 

應該評估爲true

+0

我的錯,將編輯的問題用等於 – lijat

回答

1

您可能要考慮Java的toString方法。它只產生足夠的數字以唯一地區分相鄰浮點值的值。所以像2這樣簡單的數字會產生短的字符串,但需要更多數字來表示的數字會產生更長的字符串。

由於數字的數量取決於類型(更精細的類型有更近的鄰居),所以對於floatdouble操作數,即使被轉換的值完全相同,結果也可能不同。 (討論here。)

如果可能,可以直接使用內置格式化程序,也可以通過在字符串緩衝區中操作結果。在基數之間轉換是一個令人驚訝的複雜問題,可能涉及擴展的精確算術和數學證明。已知有用於進行正確轉換的算法,並且有科學論文描述它們。所以可以自己寫,但依靠已經完成的好工作通常會更好。

在你的情況,你可能會使用這樣的:

If format string is "%f", then use the toString method. 
Otherwise, use the format method. 
0

它不能這樣做。 String.format()以小數點表示精度。浮點變量沒有小數位,它們有二進制位。 FP變量的「全機精度」是該點之後的二進制位數。

+0

但是,它至少應該可以編寫一個有足夠的小數位,所有的省略小數點應該重複嗎?我希望寫一個儘可能保持精確度的Formater。我應該如何更改我的問題以反映這一點? – lijat