float和double类型主要是为了科学计算而设计的,它们并没有提供完全精确的结果,所以不应该被用于需要精确结果的场合。
对于此,在大多数的商业计算中,一般采用BigDecimal来进行精确计算。
BigDecimal的使用步骤如下:
1.初始化一个BigDecimal对象,两种方法都可行
BigDecimal bd1 = new BigDecimal(Double.toString(0.123));
BigDecimal bd2 = BigDecimal.valueOf(0.123);
2.具体运算方法如下:
public BigDecimal add(BigDecimal value); //加法
public BigDecimal subtract(BigDecimal value); //减法
public BigDecimal multiply(BigDecimal value); //乘法
public BigDecimal divide(BigDecimal value); //除法
对于除法,要考虑除不尽的情况,因此需要指定保留小数位和取值策略的问题。
计算结束后,如果我们需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。
现在我们就来封装一个BigDecimal运算工具类,下次直接调用即可
public class BigDecimalUtil {
private BigDecimalUtil(){
}
public static BigDecimal add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
public static BigDecimal sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2);
}
public static BigDecimal mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2);
}
public static BigDecimal div(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留2位小数
//除不尽的情况
}
}