1 /** 2 * 一.java的double类型会丢失精度 3 * 二.BigDecimal不推荐使用double类型的构造参数,因为得到的值只是一个近似值,比如0.1,只会得到一个近似0.1的值 4 * 三.BigDeciaml推荐使用String类型的构造参数,因为得到的值是精确值 5 * 四.如果一定要使用double类型的,通过BigDecimal valueOf(double value)静态方法来创建BigDecimal对象 6 * @author 罗摩衔那 7 * 8 */ 9 public class Demo_BigDecimal 10 { 11 12 public static void main(String[] args) 13 { 14 BigDecimal f1=new BigDecimal("0.05");//String参数类型的构造函数 15 BigDecimal f2=BigDecimal.valueOf(0.01); 16 BigDecimal f3=new BigDecimal(0.05);//double参数类型的构造函数 17 18 System.out.println("使用String作为BigDecimal构造参数 "); 19 System.out.println("0.05+0.01="+f1.add(f2)); 20 System.out.println("0.05-0.01="+f1.subtract(f2)); 21 System.out.println("0.05*0.01="+f1.multiply(f2)); 22 System.out.println("0.05/0.01="+f1.divide(f2)); 23 24 System.out.println("使用double作为BigDecima构造参数 "); 25 System.out.println("0.05+0.01="+f3.add(f2)); 26 System.out.println("0.05-0.01="+f3.subtract(f2)); 27 System.out.println("0.05*0.01="+f3.multiply(f2)); 28 System.out.println("0.05/0.01="+f3.divide(f2)); 29 } 30 31 }
二.如果程序要对double类型的数值进行运算,可用Arith工具类
程序实质为:将double类型的数值包装成BigDecimal对象,再调用BigDecimal类的运算方法进行运算,最后转换成double类型变量
1 import java.math.BigDecimal; 2 3 public class Arith 4 { 5 public static void main(String[] args) 6 { 7 System.out.println("0.05+0.01="+Arith.add(0.05, 0.01)); 8 System.out.println("0.05+0.01="+Arith.sub(0.05, 0.01)); 9 System.out.println("0.05+0.01="+Arith.mul(0.05, 0.01)); 10 System.out.println("0.05+0.01="+Arith.div(0.05, 0.01)); 11 } 12 //默认除法运算精度 13 private static final int DEY_DIV_SCALE=10; 14 //构造器私有,让这个类不能实例化 15 private Arith() {}; 16 17 //加 18 public static double add(double b1,double b2) 19 { 20 BigDecimal v1=BigDecimal.valueOf(b1); 21 BigDecimal v2=BigDecimal.valueOf(b2); 22 return v1.add(v2).doubleValue(); 23 } 24 25 //减 26 public static double sub(double b1,double b2) 27 { 28 BigDecimal v1=BigDecimal.valueOf(b1); 29 BigDecimal v2=BigDecimal.valueOf(b2); 30 return v1.subtract(v2).doubleValue(); 31 } 32 33 //乘 34 public static double mul(double b1,double b2) 35 { 36 BigDecimal v1=BigDecimal.valueOf(b1); 37 BigDecimal v2=BigDecimal.valueOf(b2); 38 return v1.multiply(v2).doubleValue(); 39 } 40 41 //提供(相对)精确的除法运算,当发生除不尽的情况时 42 //精确到小数带你以后10位的数字四舍五入 43 public static double div(double b1,double b2) 44 { 45 BigDecimal v1=BigDecimal.valueOf(b1); 46 BigDecimal v2=BigDecimal.valueOf(b2); 47 return v1.divide(v2, DEY_DIV_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue(); 48 } 49 }