一、为什么要用

因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。
而项目里的数值计算,通常是要求精确计算的。
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。

Java bigdecimal 指定精确判断 java判断bigdecimal是否为null_System

二、方法

1、加、减、乘

BigDecimal a = new BigDecimal(10);
 BigDecimal b = new BigDecimal(5);

 BigDecimal sum = a.add(b);				// 加法
 BigDecimal sub = a.subtract(b);		// 减法
 BigDecimal mul = a.multiply(b);		// 乘法

2、除法

详细用法:
 	 divide(BigDecimal divisor, int scale, introundingMode);
 	 三个参数: 被除数、保留小数点个数、舍入模式
 	 
 舍入模式:
 	ROUND_CEILING    //向正无穷方向舍入
	ROUND_DOWN    //向零方向舍入
	ROUND_FLOOR    //向负无穷方向舍入
	ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
	ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
	ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
	ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式
	ROUND_UP    //向远离0的方向舍入 	 	

BigDecimal a = new BigDecimal(0.7);
BigDecimal b = new BigDecimal(3);

 BigDecimal div = a.divide(b, 2, BigDecimal.ROUND_HALF_UP);		// a除以b,保留两位小数,四舍五入
 System.out.println(div);		// 0.23
 System.out.println(0.7 / 3);	// 0.2333333333333333

异常:如果divide只填了第一个参数(被除数),会报错!
		BigDecimal div = a.divide(b);
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

Java bigdecimal 指定精确判断 java判断bigdecimal是否为null_ide_02


Java bigdecimal 指定精确判断 java判断bigdecimal是否为null_java_03

3、setScale方法

方法用于格式化小数点,两个参数,第一个是保留几位小数,第二位和除法的第三位参数一样,具体参考上面

BigDecimal.setScale()

表示保留一位小数,默认用四舍五入方式   setScale(1)

直接删除多余的小数位,如2.35会变成2.3 setScale(1,BigDecimal.ROUND_DOWN)

进位处理,2.35变成2.4  setScale(1,BigDecimal.ROUND_UP)

四舍五入,2.35变成2.4  setScale(1,BigDecimal.ROUND_HALF_UP)

四舍五入,2.35变成2.3,如果是5则向下舍setScaler(1,BigDecimal.ROUND_HALF_DOWN)

 bd.setScale( 0, BigDecimal.ROUND_UP ); // 向上取整
 bd.setScale( 0, BigDecimal.ROUND_DOWN ).longValue(); // 向下取整 并转成Long类型

4、转型

a.longValue(); 		转成long类型
	a.doubleValue();	转成double类型

5、比较

BigDecimal比较大小使用compareTo(BigDecimal)方法。

返回的结果是int类型,-1表示小于,0是等于,1是大于。

//前提为a、b均不能为null
if(a.compareTo(b) == -1){
    System.out.println("a小于b");
}
 
if(a.compareTo(b) == 0){
    System.out.println("a等于b");
}
 
if(a.compareTo(b) == 1){
    System.out.println("a大于b");
}
 
if(a.compareTo(b) > -1){
    System.out.println("a大于等于b");
}
 
if(a.compareTo(b) < 1){
    System.out.println("a小于等于b");
}

6、最大值、最小值、绝对值、相反数

a.max (b) //比较取最大值

  a.min(b) //比较取最小值

  a.abs()//取最绝对值

  a.negate()//取相反数