金額計算以及格式轉換__java
來源:互聯網
上載者:User
這兩天幫張XReview了一下 AmountFormat類的代碼,裡邊涉及了long(分)、double(元)資料類型的金額轉換和顯示。由於FindBugs裡也有不允許使用float、double資料類型進行金額計算的規則,所以說一下程式裡進行金額計算的規範: 1.所有涉及小數的金額計算全部使用BigDecimal來完成。 2.建立BigDecimal時,整數、字串使用BigDecimal(long/int/String)構造器,小數使用BigDecimal.valueOf(double)方法。 3.優先把所有參與計算的數轉換為BigDecimal後,使用BigDecimal本身的函數(add、subtract、multiply、divide)進行計算。不要出現計算後再建立BigDecimal對象的情況(計算可能已丟失精度)。反例:new BigDecimal(fen/100.0)。正確:new BigDecimal(fen).divide(new BigDecimal(100)) 4.得到最終結果後小數位的截取,使用 DecimalFormat完成。 5.由於最終結果是字串,用於顯示沒問題。用於儲存時,由於資料類型原因還需要parse(例:Long.parseLong(String))函數進行轉換後,再進行儲存。
1.DecimalFormat的兩個主要方法format和parse,format方法是安全執行緒的,而parse方法不是。
2.根據上邊的結論,如果只利用format方法可以多線程共用一個DecimalFormat執行個體。 如果要用parse方法,則需要每個線程單獨建立一個執行個體。 3.最後AmountFormat工具類中的方法雖然可以被多個線程同時調用, 但類中的方法只利用了format方法, 所以在類中建立一個私人的DecimalFormat執行個體提供給類中的方法使用是可以的。