一、为什么要用
因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。
而项目里的数值计算,通常是要求精确计算的。
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。
二、方法
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.
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()//取相反数