double类型之间的运算不能直接使用Double来直接进行运算:因为计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。
在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。
在使用BigDecimal类来进行计算的时候,主要分为以下步骤:
1、用float或者double变量构建BigDecimal对象。
2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
3、把BigDecimal对象转换成float,double,int等类型。
进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。
下面是一个工具类,该工具类提供加,减,乘,除运算。
public class Arith {
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
// 进行减法运算
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
// 进行加法运算
public static double mul(double d1, double d2){ // 进行乘法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.multiply(b2).doubleValue();
}
// 进行除法运算
public static double div(double d1,double d2,int len) {// 进行除法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue();
}
// 进行四舍五入操作
public double round(double d,int len) { // 进行四舍五入操作
BigDecimal b1 = new BigDecimal(d);
BigDecimal b2 = new BigDecimal(1);
// 任何一个数字除以1都是原数字
// ROUND_HALF_UP是BigDecimal的一个常量,表示进行四舍五入的操作
return b1.divide(b2, len,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
示例:
public static void main(String[] args) throws IllegalAccessException {
// TODO Auto-generated method stub
double a = 1.0;
double b = 0.3;
double c = a-b;
System.out.println(c);
System.out.println("-------------");
System.out.println(a+"和"+b+"相减:"+ Arith.sub(a, b));
System.out.println(a+"和"+b+"相加:"+ Arith.add(a, b));
System.out.println(a+"和"+b+"相乘:"+ Arith.mul(a, b));
System.out.println(a+"和"+b+"相除:"+ Arith.div(a,b,3));
// System.out.println(div(1.0,0.3, 3));
}
结果输出为: