众所周知,程序在处理货币金额类数据时,最关键的是保持精度,丢失精度就丢失了准确性,这是不可接受的。本篇经验就分享一下在Java语言中如何通过开源类库 Joda-Money 优雅地处理货币金额数据,以及如何将该类数据存库。
工具/原料
- Eclipse,Maven, Joda
方法/步骤
- 1
程序引入开源类库 Joda-Money 相关依赖
Joda-Money 是一个用于表示货币金额的开源Java类库,使用该类库处理金额相关数据,可以让你免去对数据精度的担忧。
要想使用 Joda-Money, 首先引入相关依赖,在 pom.xml 中添加如下内容:
<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 对象对应的数值,转换级秤为对应货币下最小单位对应的整数值,然后存库(避免了精度问题),比如人民币数关讨值全部用“分”来表示。
END