DecimalFormat 与 BigDecimal

这篇的内容是为了后续造库做准备的,之前没有对这两个概念整理过,借此机会就来整理一下。

目标

目标是想实现金额相关的格式化展示及计算(加,减,乘,除)

DecimalFormat

DecimalFormat 是我看到 blankj 的工具库在用,所以想以此为入口,了解了解它。

先从源头看起,DecimalFormat 继承自 NumberFormat,NumberFormat 又继承自 Format。Format 定义了如何对日期,消息,数值等进行本地化(其实就是格式化)的操作,它规定了如何本地化为 String,以及从 String 转回去的一些方法。

DateFormat, MessageFormat, NumberFormat 就是它的三个子类,对应不同的功能。

NumberFormat 顾名思义是针对数值本地化的,它也是个抽象类,DecimalFormat 是它的具体子类。

怎么用

String pattern = "";
//通过 new 的形式可以创建 DecimalFormat 对象
//入参是本地化格式,是关键,这里没有给出
DecimalFormat format = new DecimalFormat(pattern);

Pattern

类似于规则匹配,想要什么样格式的展示,就定义相应的展示规则,这个是重点。

精确度

这点主要考量在有精确度要求时,对最后一位的数值处理,参考枚举类 RoundingMode 的类说明可以很快理解想要的精度化要求。

我们要关心的主要就这两点,另外 DecimalFormat 也提供了一些其他的设置方法,可以读源码的时候试试。

BigDecimal

继承自 Number 类,代表着有符号数值,可用来做算术运算,小数位控制,精度化,比较,格式化也行。因为项目里以前也用到过它,就想拿出来和 DecimalFormat 比较比较,看是什么关系。一些常用的方法记录下,便于后续使用,

//如果返回 0 或者正数,就表示小数位的位数
//如果返回负数,那意思就大不一样,表示 10 的 n 次方的 n,这个 10 的 n 次方会 * BigDecimal 的值
public int scale() {
    return scale;
}
//加法
add(BigDecimal augend)
//可控制精度及精度化方式的加法
add(BigDecimal augend, MathContext mc)
//减法
subtract(BigDecimal subtrahend)
//可控制精度及精度化方式的减法
subtract(BigDecimal subtrahend, MathContext mc)
//乘法
multiply(BigDecimal multiplicand)
//可控制精度及精度化方式的乘法
subtract(BigDecimal multiplicand, MathContext mc)
//除法    
divide(BigDecimal divisor)
//可控制精度及精度化方式的乘法
divide(BigDecimal divisor, MathContext mc)
//控制进位方式
divide(BigDecimal divisor, RoundingMode roundingMode)
//我觉得这个可以等效 divide(BigDecimal divisor, MathContext mc)
divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
//只要商部分的结果
divideToIntegralValue(BigDecimal divisor)
//可控制精度的,只要商部分的结果
divideToIntegralValue(BigDecimal divisor, MathContext mc)
//只要余数部分的结果
remainder(BigDecimal divisor)
//可控制精度的,只要余数部分的结果
remainder(BigDecimal divisor, MathContext mc)
//商和余数都要的结果
BigDecimal[] divideAndRemainder(BigDecimal divisor)
//可控制精度的,商和余数都要的结果
BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)
//转为负数
negate()
//可控制精度的转负数
negate(MathContext mc)
//比较大小,返回 -1,0,1 对应调用者小于,等于,大于 val
compareTo(BigDecimal val)

顺着这个思路,我想 BigDecimal 可以用来做计算,DecimalFormat 可用来做格式化展示。两者可以说没什么关系,也可以说有一点关系,至少在我看来可以结合起来用。

参考内容

DecimalFormat
廖雪峰-Java教程-BigDecimal

你可能感兴趣的:(DecimalFormat 与 BigDecimal)