一、创建 BigDecimal 对象

创建BigDecimal对象常用的方式有2种:

1
2
BigDecimal a = BigDecimal.new Bigdecimal(1);
BigDecimal a1 = BigDecimal.valueOf(1);

不推荐使用new 关键字创建Bigdecimal对象。原因是当new 的值是一个小数的时候,其真实的值并不是我们想要的值

1
2
3
4
BigDecimal b = new BigDecimal(1.1);
BigDecimal b1 = BigDecimal.valueOf(1.1);
System.out.println("new的值b: "+b);
System.out.println("valueOf()的值b1: "+b1);

输出:

1
2
new的值b: 1.100000000000000088817841970012523233890533447265625
valueOf()的值b1: 1.1

这在比较大小的时候,很可能出现意想不到的结果。

二、BigDecimal 加减乘除

加法:add()
减法:subtract()
乘法:multiply()
除法:divide()

1. 加法

1
2
3
4
public BigDecimal add(BigDecimal augend)
public BigDecimal add(BigDecimal augend, MathContext mc)

MathContext : 设置保留几位小数,舍入按四舍五入

错误写法:
BigDecimal相加返回为0 Result of ‘BigDecimal.add()‘ is ignored

1
2
3
BigDecimal investment = new BigDecimal("0.00");
investment.add(new BigDecimal("100.00"));
System.out.print("investment:" + investment); //0.00

正确写法:

1
2
3
BigDecimal investment = new BigDecimal("0.00");
investment = investment.add( new BigDecimal("100.00"));
System.out.print("investment:" + investment);//100.00

2. 减法

1
2
3
4
public BigDecimal subtract(BigDecimal subtrahend)
public BigDecimal subtract(BigDecimal subtrahend, MathContext mc)

MathContext : 设置保留几位小数,舍入按四舍五入

3. 乘法

1
2
3
4
public BigDecimal multiply(BigDecimal multiplicand)
public BigDecimal multiply(BigDecimal multiplicand, MathContext mc)

MathContext : 设置保留几位小数,舍入按四舍五入

4. 除法

1
2
3
4
5
6
public BigDecimal divide(BigDecimal divisor)
public BigDecimal divide(BigDecimal divisor, MathContext mc)
public BigDecimal divide(BigDecimal divisor, int roundingMode)
public BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

其中public BigDecimal divide(BigDecimal divisor)不推荐使用。idea警告如下:

1
2
3
4
5
6
Inspection info: Reports calls to divide() or setScale() without a rounding mode argument. Such calls can lead to an ArithmeticException when the exact value cannot be represented in the result (e.g. because it has a non-terminating decimal expansion). Specifying a rounding mode prevents the ArithmeticException.

翻译:
检查信息:报告调用divide()或setScale(),而不带舍入模式参数。当结果中不能表示精确值时,这种调用可能导致算术异常(例如,因为它具有无限的十进制展开)。指定舍入模式可以防止算术异常。

简单点说就是除不尽的时候会报错

所以用除法的时候,我们需要指定其舍入模式。推荐使用:

1
2
3
4
5
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

scale : 保留几位小数
RoundingMode : 指定舍入模式

Demo:

1
2
BigDecimal divide = a.divide(b, 2, RoundingMode.DOWN);
System.out.println("divide: "+divide);

三、判断 BigDecimal 大于0、小于0和等于0

使用 compareTo(Bigdecimal bigdecimal),传入BigDecimal.ZERO返回0表示等于0,返回1表示大于0,返回-1表示小于0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
System.out.println("0-0="+new BigDecimal("0").compareTo(BigDecimal.ZERO));  
System.out.println("0.0-0="+new BigDecimal("0.0").compareTo(BigDecimal.ZERO));
System.out.println("0.00-0="+new BigDecimal("0.00").compareTo(BigDecimal.ZERO));
System.out.println("0.000-0="+new BigDecimal("0.000").compareTo(BigDecimal.ZERO));
System.out.println("0.00001-0="+new BigDecimal("0.00001").compareTo(BigDecimal.ZERO));
System.out.println("0.0000001-0="+new BigDecimal("0.0000001").compareTo(BigDecimal.ZERO));
System.out.println("-0.00001-0="+new BigDecimal("-0.00001").compareTo(BigDecimal.ZERO));
System.out.println("-0.0000001-0="+new BigDecimal("-0.0000001").compareTo(BigDecimal.ZERO));
返回:
0-0=0
0.0-0=0
0.00-0=0
0.000-0=0
0.00001-0=1
0.0000001-0=1
-0.00001-0=-1
-0.0000001-0=-1