BigDecimal
BigDecimal
概述
和BigInteger类似,BigDecimal可以表示一个任意大小且精度完全准确的浮点数。
/**
* @Description: 创建一个BigDecimal实例
*
* @return BigDecimal
* @param num
* @return
*
* @date: 2019年10月15日 下午4:42:01
*/
public static BigDecimal createBigDecimal(String num) {
return new BigDecimal(num);
}
组成
如果查看BigDecimal的源码,可以发现,实际上一个BigDecimal是通过一个BigInteger和一个scale来表示的,即BigInteger表示一个完整的整数,而scale表示小数位数:
public class BigDecimal extends Number implements Comparable<BigDecimal> {
private final BigInteger intVal;
private final int scale;
}
对小数位进行操作
/**
*
* @Description: 获取BigDecimal小数位数
*
* 如果返回的是负数,则表示该数为整数,并且后 |返回值| 位为0。
*
* @return int
* @param bd
* @return
*
* @author: lenovo
* @date: 2019年10月15日 下午4:44:37
*/
public static int BigDecimalGetScale(BigDecimal bd) {
return bd.scale();
}
/**
*
* @Description: 对BigDecimal小数位截取
*
* @return BigDecimal
* @param bd
* @param roundType 截取方式
* RoundingMode.HALF_UP 四舍五入
* RoundingMode.DOWN 直接截断
* @param digit 截取后的小数位数
* @return
*
* @author: lenovo
* @date: 2019年10月15日 下午4:53:43
*/
public static BigDecimal BigDecimalSetScale(BigDecimal bd,RoundingMode roundType,int digit) {
return bd.setScale(digit, roundType);
}
/**
*
* @Description: 消除末尾多余的0
* 1.10000 -> 1.1
*
* @return BigDecimal
* @param bd
* @return
*
* @author: lenovo
* @date: 2019年10月15日 下午4:46:10
*/
public static BigDecimal BigDecimalStripTrailingZeros(BigDecimal bd) {
return bd.stripTrailingZeros();
}
运算
/**
*
* @Description: 两个BigDecimal只能通过方法进行数值计算
*
* @return BigInteger
* @param bi1
* @param bi2
* @param calculateType
* @return
*
* @date: 2019年10月15日 下午4:18:59
*/
public static BigDecimal calculate(BigDecimal bd1,BigDecimal bd2,String calculateType) {
switch (calculateType) {
case "+":
return bd1.add(bd2);
case "-":
return bd1.subtract(bd2);
case "*":
return bd1.multiply(bd2);
case "/":
// 除法存在除不尽的情况,所以需要对小数位数进行设置
return bd1.divide(bd2,10,RoundingMode.HALF_UP);
case "^":
return bd1.pow(bd2.intValueExact());
default:
return null;
}
}
比较两个BigDecimal的大小
- equals():不但要求两个BigDecimal的值相等,还要求它们的scale()相等。1.equals(1.0) false
- compareTo()用于比较两个BigDecimal大小
- 返回负数:小于
- 返回0:等于
- 返回正数:大于
public static void main(String[] args) {
BigDecimal d1 = new BigDecimal("123.456");
BigDecimal d2 = new BigDecimal("123.45600");
// false,因为scale不同
System.out.println(d1.equals(d2));
// true,因为d2去除尾部0后scale变为2
System.out.println(d1.equals(d2.stripTrailingZeros()));
// 0
System.out.println(d1.compareTo(d2));
}