不可变类,可以是任意有符号的十进制数。可以表示一个任意大小且精度完全准确的浮点数。
常量(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中文文档)
public BigDecimal add(BigDecimal augend)
返回的值是 BigDecimal
(this + augend)
,其规模 max(this.scale(), augend.scale())
。BigDecimal用scale()表示小数位数。
augend
值被添加到这个 BigDecimal
。this + augend
public BigDecimal subtract(BigDecimal subtrahend)
返回的值是 BigDecimal
(this - subtrahend)
,其规模 max(this.scale(), subtrahend.scale())
。
subtrahend
值可从这 BigDecimal
减去。this - subtrahend
public BigDecimal multiply(BigDecimal multiplicand)
返回的值是 BigDecimal
(this × multiplicand)
,其规模 (this.scale() + multiplicand.scale())
。
multiplicand
值被乘以这个 BigDecimal
。this * multiplicand
public BigDecimal divide(BigDecimal divisor,
MathContext mc)
返回的值是 BigDecimal
(this / divisor)
,舍入根据语境的设置。
divisor
值,这 BigDecimal
是分。mc
的情况下使用。this / divisor
,圆形是必要的。ArithmeticException
-如果结果不精确但舍入模式 UNNECESSARY
或 mc.precision == 0
和商有一个十进制小数点扩张。public BigDecimal divide(BigDecimal divisor,
int scale,
RoundingMode roundingMode)
返回的值是 BigDecimal
(this / divisor)
,其规模为指定的。如果必须执行以指定的规模生成结果,则应用指定的四舍五入模式。
divisor
值,这 BigDecimal
是分。scale
的 BigDecimal
商规模要返回。roundingMode
-舍入模式适用。roundingMode
常用HALF_UP
表示四舍五入,对应BigDecimal
的ROUND_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