一、BigDecimal简介
1、特性
2、使用场景
二、创建BigDecimal
//用double创建
BigDecimal one = new BigDecimal(1.5105);
//用String创建
BigDecimal two = new BigDecimal("1.5105");
//用int创建
BigDecimal six = new BigDecimal(1);
//false,用double创建的不精确,一般避免使用
System.out.println(one.equals(two));
//1.510499999999999953814722175593487918376922607421875
System.out.println(one);
//可以先转String,值精确
BigDecimal one = new BigDecimal(Double.toString(1.5105));
//特殊值如下
BigDecimal three = BigDecimal.ONE;//1
BigDecimal four = BigDecimal.TEN;//10
BigDecimal five = BigDecimal.ZERO;//0
三、BigDecimal与其他数据类型之间转换
1、BigDecimal转为其他类型
BigDecimal two = new BigDecimal("-1.5105");
double num1 = two.doubleValue();
float num2 = two.floatValue();
//-1
int num3 = two.intValue();
long num4 = two.longValue();
BigInteger num5 = two.toBigInteger();
String str = two.toString();
2、其他类型转为BigDecimal
Double num1 = 1.5105;
Integer num2 = 23;
Long num3 = 154652L;
String str = "1.5105";
BigDecimal one1 = new BigDecimal(num1);
BigDecimal one2 = new BigDecimal(num2);
BigDecimal one4 = new BigDecimal(num3);
BigDecimal one3 = new BigDecimal(str);
BigDecimal one5 = BigDecimal.valueOf(num1);
BigDecimal one6 = BigDecimal.valueOf(num2);
BigDecimal one7 = BigDecimal.valueOf(num3);
四、BigDecimal的四则运算
1、常规加减乘除
BigDecimal one = new BigDecimal("66");
BigDecimal two = BigDecimal.valueOf(20.5);
//加法add、减法subtract、66+20.5-20.5
BigDecimal three = one.add(two).subtract(two);
//乘法multiply、除法divide、66*66/20.5
BigDecimal four = three.multiply(one).divide(two);
2、除法保留小数
1中的除法divide会报以下ArithmeticException算数异常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
原因是计算结果为无限小数,无法得到精确的值,故要用到保留小数。底层方法如下:
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode){
//TODO
}
其中scale参数为保留小数位数,roundingMode为保留小数的方式,使用方式如下:
BigDecimal one = new BigDecimal("66");
BigDecimal two = BigDecimal.valueOf(20.1);
BigDecimal four = one.divide(two,3,BigDecimal.ROUND_UP);
//输出3.284
System.out.println(four);
3、roundingMode参数取值和解释如下:
ROUND_UP BigDecimal.ROUND_UP=0,直接进位,向远离0的方向保留 1.2-->2 -1.2-->-2
ROUND_DOWN BigDecimal.ROUND_DOWN=1,直接舍弃,向靠近0的方向保留 1.2-->1 -1.2-->-1
ROUND_CEILING BigDecimal.ROUND_CEILING=2,向正无穷方向保留 1.2-->2 -1.2-->-1
ROUND_FLOOR BigDecimal.ROUND_FLOOR=3,向负无穷方向保留 1.2-->1 -1.2-->-2
ROUND_HALF_UP BigDecimal.ROUND_HALF_UP=4,以5为界,5进位,四舍五入 1.4-->1 -1.5-->-2
ROUND_HALF_DOWN BigDecimal.ROUND_HALF_DOWN=5,以5为界,5舍位,五舍六入 1.5-->1 -1.6-->-2
ROUND_HALF_EVEN BigDecimal.ROUND_HALF_EVEN=6,以5为界,5进舍使最后一位为偶数 1.2-->2 -2.2-->-2
ROUND_UNNECESSARY BigDecimal.ROUND_UNNECESSARY=7,精确值,无舍位操作,scale小于精确小数位数会报错
五、BigDecimal的大小比较
BigDecimal one = BigDecimal.valueOf(1);
BigDecimal two = BigDecimal.valueOf(2);
//小于-1
int i1 = one.compareTo(two);
//等于0
int i2 = two.compareTo(two);
//大于1
int i3 = two.compareTo(one);
//是否相等false
boolean res = one.equals(two);
六、BigDecimal的其他常用方法
1、abs绝对值
BigDecimal two = new BigDecimal("-1.5105");
//1.5105
BigDecimal one = two.abs();
2、scale小数位数
BigDecimal two = new BigDecimal("-1.5105");
//4
int scale = two.scale();
3、设置小数位数
//-1.51
BigDecimal two = new BigDecimal("-1.5105").setScale(2,BigDecimal.ROUND_HALF_UP);