众所周知,程序在处理货币金额类数据时,最关键的是保持精度,丢失精度就丢失了准确性,这是不可接受的。本篇经验就分享一下在Java语言中如何通过开源类库Joda-Money优雅地处理货币金额数据,以及如何将该类数据存库。
工具/原料
Eclipse,Maven,Joda
方法/步骤
1、程序引入开源类库Joda-Money相关依赖Joda-Money是一个用于表示货币皙祛土耘金额的开源Java类库,使用该类库处理金额相关数据,可以让你免去对数据精度的馆啼柏酮担忧。要想使用Joda-Money,首先引入相关依赖,在pom.xml中添加如下内容:<dependency><groupId>org.joda</groupId><artifactId>joda-money</artifactId><version>1.0.1</version></dependency><dependency><groupId>org.jadira.usertype</groupId><artifactId>usertype.core</artifactId><version>6.0.1.GA</version></dependency>
2、使用Joda-Money创建一个货币金额对象Joda-Money提供了一个Money来表述一个货币金额(底层使用的是BigDecimal),该类提供了一系列静态方法创建相应的对象,注意,在创建Money对象时,必须指定货币代码来标注该数据对应的具体币种!比如人民币的货币代码是CNY,美元的货币代码是USD,日元的JPY等。
3、币种对应的最大小数位校验每种币种都定义了一个默认最大的小数位,比如人民币最大小数位是2(即最小数值单位为“分”),美元最大小数位也是2,日元最大小数位是0,在指明货币代码和数值创建Money对象时,如果你的数值的小数位超过具体货币允许的最大小数位,会报错。
4、货币对象的加法与减法操作通过Money类提供的plus和minus方法即可实现多个Money对象的加减操作,但必须注意的是,只有同一货币的Money对象才能直接进行运算,否则会报错!
5、货币对象的乘法与除法操作通过Money类提供的multipliedBy和咯悝滩镞dividedBy实现Money对象和一个数字的乘除运算,因为在运算过程中芟坳葩津,会出现小数位数量超过该货币最大允许小数位,因此需要通过RoundingMode指定小数位的处理方式。RoundingMode中定义了很多小数位相关的处理方式,比如RoundingMode.HALF_UP为四舍五入,RoundingMode.DOWN为直接抛弃超出的精度等。
6、货币之间的转换操作Money对象提供了一种货币到另一种货币的转换,只需提供另一种货币的代码和汇率信息即可,和乘除法类似,在转换过程中,会出现小数位数超出目标货币所允许的最大位数,因此同样需要指定小数位的处理方式。
7、货币存库通过使用Joda-Money来处理货币信息,如果要将这些数值存入数据库中,有如下两种方式:1.获取Money对象内部的BigDecimal存库2.将Money对象对应的数值,转换为对应货币下最小单位对应的整数值,然后存库(避免了精度问题),比如人民币数值全部用“分”来表示。