一:背景
在项目中,金额的计算通常使用BigDecimal来保证精确计算。BigDecimal可以处理任意长度数字序列的数值,实现了任意精度的浮点数运算。《阿里巴巴 Java 开发手册》中提到:浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用 equals 来判断。
Double a1=1.11111111111111111111d;
Double a2=1.11111111111111111112d;
System.out.println(a1);
System.out.println(a2);
System.out.println(a1.equals(a2));
//结果
1.1111111111111112
1.1111111111111112
true
二:注意事项
在使用BigDecimal的时候,应尽量使用String类型,否则会存在丢失精度。
BigDecimal a = new BigDecimal("1.01");
BigDecimal b = new BigDecimal(String.valueOf(1.151561d));
三:相关API
加减乘除
//加
num1.add(num2);
//减
num1.subtract(num2);
//乘
num1.multiply(num2);
//除,保留两位小数,且取四舍五入
num1.divide(num2,2,BigDecimal.ROUND_HALF_UP);
//绝对值
num1.abs();
除的API
divisor 要除以的数,scale小数位数, roundingMode 保留位数
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) {
return divide(divisor, scale, roundingMode.oldMode);
}
常用的舍入模式:ROUND_HALF_UP 四舍五入
保留小数位数:
下图设置两位小数
BigDecimal a = new BigDecimal("1.041");
BigDecimal b = a.setScale(2, BigDecimal.ROUND_HALF_UP); //1.04
比较大小
BigDecimal a = new BigDecimal("1.041");
BigDecimal b = a.setScale(2, BigDecimal.ROUND_HALF_UP);
//<0 代表a小于b, 大于0代表a大于b,==0代表a等于b
System.out.println(a.compareTo(b));
位数左移、右移
BigDecimal a = new BigDecimal("1.041");
//104.1
System.out.println(a.movePointRight(2));
//0.1041
System.out.println(a.movePointLeft(1));