Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double最多可以处理16位有效数,BigDecimal一般用于对小数点有精确要求的地方,比如涉及钱的计算过程一般就不用double。 下面是介绍BigDecimal的一些基础运算。
BigDecimal bigDecimal = new BigDecimal(数值类型或者字符串类型);
加法: add()
减法:subtract()
乘法:multiply()
除法:divide()
绝对值:abs()
具体示例代码可以看工具类。
(1) BigDecimal.ROUND_CEILING 向上进位,若当前精度位后一位数字不为0 , 则向上进位,数字更大
(2) BigDecimal.ROUND_FLOOR 向下舍位,若当前精度位后一位数字不为0 , 则向下舍位,数字更小
(3) BigDecimal.ROUND_HALF_UP 4舍5入 正数4舍5进 , 负数4舍5退,比如:
(4) BigDecimal.ROUND_HALF_DOWN 5舍6入, 和上面的 4舍5入类似, 正数5舍6进,负数5舍6退
(5) BigDecimal.ROUND_HALF_EVEN , 银行家算法,4舍6入 , 5看前数 , 奇进偶舍
(6) BigDecimal.ROUND_UP 绝对值向上进位,若当前精度位后一位数字不为0 , 则绝对值向上进位,正数更大 ,负数更小
(7) BigDecimal.ROUND_DOWN , 绝对值向下舍位,若当前精度位后一位数字不为0 , 则绝对值向下舍位,正数更小 , 负数更大
(8) BigDecimal.ROUND_UNNECESSARY,不舍位,精度位数小于小数位数会抛出异常
自定义的工具类主要用于double类型数据的运算,简化将double数据转为BigDecimal数据,再转回double类型数据的过程。
import java.math.BigDecimal;
public class BigDecimalUtils {
/**
* 加法
* @param v1
* @param v2
* @return
*/
public static double add(double v1, double v2) {
BigDecimal bigDecimal1 = new BigDecimal(v1);
BigDecimal bigDecimal2 = new BigDecimal(v2);
return bigDecimal1.add(bigDecimal2).doubleValue();
}
/**
* 除法
* @param v1
* @param v2
* @return
*/
public static double divide(double v1, double v2){
if (v2 <= 0) {
throw new ArithmeticException("被除数异常");
}
BigDecimal bigDecimal1 = new BigDecimal(v1);
BigDecimal bigDecimal2 = new BigDecimal(v2);
// 2位小数, 绝对值向上进位
return bigDecimal1.divide(bigDecimal2, 2, BigDecimal.ROUND_UP).doubleValue();
}
/**
* 减法
* @param v1
* @param v2
* @return
*/
public static double subtract(double v1, double v2){
BigDecimal bigDecimal1 = new BigDecimal(v1);
BigDecimal bigDecimal2 = new BigDecimal(v2);
return bigDecimal1.subtract(bigDecimal2).doubleValue();
}
/**
* 乘法
* @param v1
* @param v2
* @return
*/
public static double multiply(double v1, double v2){
BigDecimal bigDecimal1 = new BigDecimal(v1);
BigDecimal bigDecimal2 = new BigDecimal(v2);
// 2位小数, 绝对值向上进位
return bigDecimal1.multiply(bigDecimal2).setScale(2, BigDecimal.ROUND_UP).doubleValue();
}
}