天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。

Java中金额处理那点事儿

往事如烟 166次浏览 0个评论 扫描二维码

1、java对金额处理

众所周知,程序在处理货币金额类数据时,最关键的是保持精度,丢失精度就丢失了准确性,这是不可接受的,银行存蓄,股票,基金都是如此。java处理金额,一定不能用double和float类型,二进制无法准确表达十分之一,就像十进制无法准确表达三分之一一样。处理金额要使用Bigdemical类

API

  • 构造器:
构造器 描述
BigDecimal(int) 创建一个具有参数所指定整数值的对象
BigDecimal(double) 创建一个具有参数所指定双精度值的对象
BigDecimal(long) 创建一个具有参数所指定长整数值的对象
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象
  • 常用函数:
方法 描述
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象
toString() 将BigDecimal对象的数值转换成字符串
doubleValue() 将BigDecimal对象中的值以双精度数返回
floatValue() 将BigDecimal对象中的值以单精度数返回
longValue() 将BigDecimal对象中的值以长整数返回
intValue() 将BigDecimal对象中的值以整数返回

更详细了解:https://zhuanlan.zhihu.com/p/110540854

同时,如果想要更优雅的处理金额和货币信息,这里推荐一个金额处理的工具类 Joda-Money。欢迎关注我们,公号终码一生。

Joda-Money 是一个用于表示货币金额的开源Java类库,使用该类库处理金额相关数据,可以让你免去对数据精度的担忧。

只需要引入相关依赖,在 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>

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

文档 https://www.joda.org/joda-money/index.html
Github https://github.com/JodaOrg/joda-money

 

2、数据库中金额存储类型

那么存储时需要注意些什么呢?

以 MySQL 为例。

在数据库中,金额的存储我们常用Decimal和Numric类型表示,很少使用float或者是double,还是因为这两者是以二进制储存的,存在一定的误差。此外还要注意的就是默认值,一定写成0.00,不要用默认的NULL,否则在进行加减乘除等操作时,会带来一些不必要的麻烦。当然,加减乘除的操作,我们在java中也是要使用Bigdemical类封装好的函数,而非直接使用运算符

参考:https://blog.csdn.net/xzp_12345/article/details/79460410

 

3、最后

金额处理不可小视,本文只是简单的介绍了下,并推荐相关的工具类,并没有去做深入的研究,感兴趣的小伙伴,可以做更深入的研究。好了,上面的内容希望对大家在开发中有所帮助。

 

本文转自于:终码一生


ITZOO版权所有丨如未注明 , 均为原创丨转载请注明来自IT乐园 ->Java中金额处理那点事儿
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址