众所周知,程序在处理货币金额类数据时,最关键的是保持精度,丢失精度就丢失了准确性,这是不可接受的。本篇经验就分享一下在Java语言中如何通过开源类库 Joda-Money 优雅地处理货币金额数据,以及如何将该类数据存库。

 

工具/原料

  • Eclipse,Maven, Joda

方法/步骤

  1. 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. 2

    使用 Joda-Money 创建一个货币金额对象

    Joda-Money 提供了一个 Money 来表述一个货币金额 (底层使用的是 BigDecimal ),该类提供了一系列静态方法创建相应的对象,注意,在创建 Money 对象时,必须指定货币代码来标注该数据对应的具体币种!比如人民币的货币代码是CNY, 美元的货币代码是 USD ,日元的 JPY 等。

     

  3. 3

    币种对应的最大小数位校验

    每种币种都定义了一个默认最大的小数位,比如人民币最大小数位是 2(即最小数值单位为“分”),美元最大小数位也是 2,日元最大小数位是 0,在指明货币代码和数值创建 Money 对象时,如果你的数值的小数位超过具体货币允许的最大小数位,会报错。

     

  4. 4

    货币对象的加法与减法操作

    通过 Money 类提供的 plus 和 minus 方法即可实现多个 Money 对象的加减操作,但必须注意的是,只有同一货币的 Money 对象才能直接进行运算,否则会报错!

     

  5. 5

    货币对象的乘法与除法操作

    通过 Money 类提供的 multipliedBy 和 dividedBy 实现 Money 对象和一个数字的乘除运算,因为在运算过程中,会出现小数位数量超过该货币最大允许小数位,因此需要通过 RoundingMode 指定小数位的处理方式。

    RoundingMode 中定义了很多小数位相关的处理方式,比如 RoundingMode.HALF_UP 为四舍五入,RoundingMode.DOWN 为直接抛弃超出的精度等。

  6. 6

    货币之间的转换操作

    Money对象提供了一种货币到另一种货币的转换,只需提供另一种货币的代码和汇率信息即可,和乘除法类似,在转换过程中,会出现小数位数超出目标货币所允许的最大位数,因此同样需要指定小数位的处理方式。

  7. 7

    货币存库

    通过使用 Joda-Money 来处理货币信息,如果要将这些数值存入数据库中,有如下两种方式:

    1. 获取 Money 对象内部的销独霸 BigDecimal 存库

    2. 将 Money 对象对应的数值,转换级秤为对应货币下最小单位对应的整数值,然后存库(避免了精度问题),比如人民币数关讨值全部用“分”来表示。

     

    END
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。