金額計算以及格式轉換
阿新 • • 發佈:2018-10-31
這兩天幫張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例項提供給類中的方法使用是可以的。
1.DecimalFormat的兩個主要方法format和parse,format方法是執行緒安全的,而parse方法不是。
2.根據上邊的結論,如果只利用format方法可以多執行緒共享一個DecimalFormat例項。 如果要用parse方法,則需要每個執行緒單獨建立一個例項。 3.最後AmountFormat工具類中的方法雖然可以被多個執行緒同時呼叫,