金额计算以及格式转换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/blue_dd/article/details/56846117
这两天帮张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实例提供给类中的方法使用是可以的。



猜你喜欢

转载自blog.csdn.net/blue_dd/article/details/56846117