BigDecimal常用API及使用

BigDecimal 常用API及使用

不可变类,可以是任意有符号的十进制数。可以表示一个任意大小且精度完全准确的浮点数。

常量(JDk1.8 API中文文档):

ZERO:值为0,标度为0。

ONE:值1,标度为0。

TEN:值为10,标度为0。

ROUND_UP:舍入模式从零开始。始终在非零丢弃分数之前增加数字。请注意,该舍入模式不会降低计算值的大小。

ROUND_DOWN:舍入模式向零舍入。不要在丢弃的分数之前递增数字(即截断)。请注意,该舍入模式不会增加计算值的大小。

ROUND_CEILING:圆形模式向正无穷大转弯。如果BigDecimal为正,则表现为ROUND_UP ;如果为负,则表现为ROUND_DOWN 。请注意,舍入模式不会降低计算值。

ROUND_FLOOR:舍入模式向负无穷大转弯。如果BigDecimal为正,则表现为ROUND_DOWN ;如果为负,表现为ROUND_UP 。请注意,舍入模式不会增加计算值。

ROUND_HALF_UP:四舍五入模式向“最近邻居”转弯,除非两个邻居都是等距的,在这种情况下是圆括弧的。对于ROUND_UP如果丢弃的分数为0.5,则表现为;否则,表现为ROUND_DOWN 。请注意,这是我们大多数人在小学教学的舍入模式。

ROUND_HALF_DOWN:四舍五入模式向“最近邻居”转弯,除非这两个邻居都是等距离的,在这种情况下,这是倒圆的。对于ROUND_UP如果丢弃的分数> 0.5,则表示行为;否则,表现为ROUND_DOWN

ROUND_HALF_EVEN:四舍五入模式向“最近邻居”转弯,除非两个邻居都是等距离的,在这种情况下,向着邻居方向转移。对于ROUND_HALF_UP行为,如果丢弃的分数的左边的数字是奇数的;像ROUND_HALF_DOWN一样,如果它是均匀的。请注意,这是在一系列计算中重复应用时最小化累积误差的舍入模式。

ROUND_UNNECESSARY:舍入模式来确定所请求的操作具有精确的结果,因此不需要舍入。如果在产生不精确结果的操作上指定了舍入模式,则抛出ArithmeticException

class DemoApplicationTests {
    @Test
    void contextLoads() {
        BigDecimal number=new BigDecimal(4.35);
        System.out.println("ZERO:"+number.ZERO);//默认值为0
        System.out.println("ONE:"+number.ONE);//默认值为1
        System.out.println("TEN:"+number.TEN);//默认值为10
        //该规则下均进一位计算值
        System.out.println("ROUND_UP:"+new BigDecimal("6.60").setScale(1,BigDecimal.ROUND_UP));
        //该规则下保留位之后的数据全部舍弃
        System.out.println("ROUND_DOWN:"+new BigDecimal("6.69").setScale(1,BigDecimal.ROUND_DOWN));
        //若数值为正,则与ROUND_UP规则相同,若数据为负,则与ROUND_DOWN规则相同
        System.out.println("ROUND_CEILING:"+new BigDecimal("-6.69").setScale(1,BigDecimal.ROUND_CEILING));
        //若数值为负,则与ROUND_UP规则相同,若数值为正,则与ROUND_DOWN规则相同
        System.out.println("ROUND_FLOOR:"+new BigDecimal("6.69").setScale(1,BigDecimal.ROUND_FLOOR));
        //四舍五入, 数值>=.5则进一位
        System.out.println("ROUND_HALF_UP:"+new BigDecimal("6.65").setScale(1,BigDecimal.ROUND_HALF_UP));
        //四舍五入,数值>.5则进一位
        System.out.println("ROUND_HALF_DOWN:"+new BigDecimal("6.65").setScale(1,BigDecimal.ROUND_HALF_DOWN));
        //若舍弃部分左边的数值为偶数,则做ROUND_HALF_DOWN处理,若为奇数,则做ROUND_HALF_UP处理
        System.out.println("ROUND_HALF_EVEN:"+new BigDecimal("6.635").setScale(2,BigDecimal.ROUND_HALF_EVEN));
        //所请求的操作具有精确的结果,因此不需要舍入。如果在产生不精确结果的操作上指定了舍入模式,则抛出`ArithmeticException`
        System.out.println("ROUND_UNNECESSARY:"+new BigDecimal("5").setScale(1,BigDecimal.ROUND_UNNECESSARY));
    }
}
ZERO:0
ONE:1
TEN:10
ROUND_UP:6.6
ROUND_DOWN:6.6
ROUND_CEILING:-6.6
ROUND_FLOOR:6.6
ROUND_HALF_UP:6.7
ROUND_HALF_DOWN:6.6
ROUND_HALF_EVEN:6.64
ROUND_UNNECESSARY:5.0

常用方法摘要(JDk1.8 API中文文档)

  1. add
public BigDecimal add(BigDecimal augend)

返回的值是 BigDecimal (this + augend),其规模 max(this.scale(), augend.scale())。BigDecimal用scale()表示小数位数。

  • 参数
    augend值被添加到这个 BigDecimal
  • 结果
    this + augend
  1. subtract
public BigDecimal subtract(BigDecimal subtrahend)

返回的值是 BigDecimal (this - subtrahend),其规模 max(this.scale(), subtrahend.scale())

  • 参数
    subtrahend值可从这 BigDecimal减去。
  • 结果
    this - subtrahend
  1. multiply
public BigDecimal multiply(BigDecimal multiplicand)

返回的值是 BigDecimal (this × multiplicand),其规模 (this.scale() + multiplicand.scale())

  • 参数
    multiplicand值被乘以这个 BigDecimal
  • 结果
    this * multiplicand
  1. divide
public BigDecimal divide(BigDecimal divisor,
                         MathContext mc)

返回的值是 BigDecimal (this / divisor),舍入根据语境的设置。

  • 参数
    divisor值,这 BigDecimal是分。
    mc的情况下使用。
  • 结果
    this / divisor,圆形是必要的。
  • 异常
    ArithmeticException -如果结果不精确但舍入模式 UNNECESSARYmc.precision == 0和商有一个十进制小数点扩张。
  1. divide
public BigDecimal divide(BigDecimal divisor,
                         int scale,
                         RoundingMode roundingMode)

返回的值是 BigDecimal (this / divisor),其规模为指定的。如果必须执行以指定的规模生成结果,则应用指定的四舍五入模式。

  • 参数
    divisor值,这 BigDecimal是分。
    scaleBigDecimal商规模要返回。
    roundingMode -舍入模式适用。
    roundingMode常用HALF_UP表示四舍五入,对应BigDecimalROUND_HALF_UP
  • 结果
    this / divisor
  • 异常
    ArithmeticException -如果 divisor是零, roundingMode==RoundingMode.UNNECESSARY和指定的规模不足表示相除的结果准确。
class TestApplicationTests {
    @Test
    void test() {
        BigDecimal a = new BigDecimal("100");
        BigDecimal b = new BigDecimal("300");
        //简单的加减乘除
        BigDecimal c1 = a.add(b);
        BigDecimal c2 = a.subtract(b);
        BigDecimal c3 = a.multiply(b);
        BigDecimal c4 = b.divide(a, MathContext.DECIMAL32);//保留7位小数并四舍五入
        System.out.println("加法运算:" + c1);
        System.out.println("减法运算:" + c2);
        System.out.println("乘法运算:" + c3);
        System.out.println("除法运算1:" + c4);
        //MathContext
        /*public static final MathContext DECIMAL32 =
                new MathContext(7, RoundingMode.HALF_EVEN);*/

        /*public static final MathContext DECIMAL64 =
                new MathContext(16, RoundingMode.HALF_EVEN);*/

        /*public static final MathContext DECIMAL128 =
                new MathContext(34, RoundingMode.HALF_EVEN);*/
        //关于除法运算
        BigDecimal a1 = new BigDecimal("1");
        BigDecimal b1 = new BigDecimal("3");
        BigDecimal c5 = a1.divide(b1, MathContext.DECIMAL128);//保留34位小数并四舍五入
        System.out.println("除法运算2:" + c5);
        c5 = a1.divide(b1, 4, RoundingMode.HALF_EVEN);//保留四位并四舍五入
        System.out.println("除法运算3:" + c5);
    }
}
加法运算:400
减法运算:-200
乘法运算:30000
除法运算1:3
除法运算2:0.3333333333333333333333333333333333
除法运算3:0.3333

你可能感兴趣的:(java语言,java,开发语言,后端)