一、认识
float和double两种数据类型容易引起精度的丢失,所以java提供BigDecimal类提高精度。该类提供了大量的构造器用于 创建BigDecimal 对象,把所有的基本数值类型变量转换成一个BigDecimal对象。
二、常用的两个构造器:
1、BigDecimal(double value):不推荐使用该构造器,因为当使用new BigDecimal(0.1)来创建一个对象时,它的值不是0.1,而实际上是一个近似0.1的值,表面看着是个0.1。
2、BidDiecimal(String value):推荐使用这个构造器,newBigDecimal("0.1")来创建一个对象时,得到的和预期的一样是个0.1的值。
注意如果非要接收一个double的值得话,可以通过BigDecimal.valueOf(double value)静态方法来创建对象。例如:
BigDecimal f2 = BigDecimal.valueOf(0.01);
三、基本操作
add(BigDecimal value):精确加法
subtract(BigDecimal value):精确减法
multiply(BigDecimal value):精确乘法
divide(BigDecimal value);精确除法
四、java实现
import java.math.BigDecimal;
public class BigDecimalTest {
public static void main(String[] args){
BigDecimal f1 = new BigDecimal("0.05");
BigDecimal f2 = BigDecimal.valueOf(0.01);
BigDecimal f3 = new BigDecimal(0.05);
System.out.println(f1);
System.out.println("使用String作为BigDecimal构造器参数");
System.out.println(f2);
System.out.println("0.05 + 0.01 = " + f1.add(f2));
System.out.println("0.05 - 0.01=" + f1.subtract(f2));
System.out.println("0.05 * 0.01=" + f1.multiply(f2));
System.out.println("0.05 / 0.01=" + f1.divide(f2));
System.out.println("使用double作为BigDecimal构造器参数:");
System.out.println("0.05 + 0.01 =" + f3.add(f2));
System.out.println("0.05 - 0.01 =" + f3.subtract(f2));
System.out.println("0.05 * 0.01 =" + f3.multiply(f2));
System.out.println("0.05 / 0.01 =" + f3.divide(f2));
}
}
结果:
五、Arith工具类
过程:先将double数值包装成BigDecimal类型,运算出结果后,再转成double类型。
java实现:
import java.math.BigDecimal;
public class Arith {
//默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
//构造器私有,让这个类不能实例化
private Arith(){}
//提供精确的加法运算
public static double add(double v1,double v2){
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.add(b2).doubleValue();
}
//提供精确的减法运算
public static double sub(double v1,double v2){
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.subtract(b2).doubleValue();
}
//提供精确的乘法运算
public static double mul(double v1,double v2){
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.multiply(b2).doubleValue();
}
//提供精确的除法运算
public static double div(double v1,double v2){
BigDecimal b1 = BigDecimal.valueOf(v1);
BigDecimal b2 = BigDecimal.valueOf(v2);
return b1.divide(b2).doubleValue();
}
}
//ArithMain类
public class ArithMain {
public static void main(String[] args){
System.out.println("0.06 + 0.02 = " + Arith.add(0.06,0.02));
System.out.println("0.06 - 0.02 = " + Arith.sub(0.06,0.02));
System.out.println("0.06 * 0.02 = " + Arith.mul(0.06,0.02));
System.out.println("-123.3 / 100 = " + Arith.div(-123.3,100));
}
}
结果: