在Java中,浮点数有两种:float 和 double,而计算机中的数据是以二进制存储的,浮点数会丢失一定的精确度,因此Java提供了BigDecimal来处理浮点数,BigDecimal是java.math包中提供的API类,用来对超过16位有效位的数进行精确的运算。
BigDecimal所创建的是对象,因此不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,必须调用其相对应的方法。调用方法中的参数也必须是BigDecimal的对象。
下面就BigDecimal的基本使用方法做以下介绍
一、将Double数据转换成BigDecimal
Double num = 123456789.98;
System.err.println(num); //输出结果:1.2345678998E8
BigDecimal bd1=new BigDecimal(num);
System.err.println(bd1); //输出结果:123456789.98000000417232513427734375
BigDecimal bd2=new BigDecimal(num + "");
System.err.println(bd2); //输出结果:123456789.98
对比输出结果,要想正确取到num的值,正确的方法是
BigDecimal bd2=new BigDecimal(num + "");
System.err.println(bd2); //输出结果:123456789.98
二、BigDecimal去掉科学计数法
Double num = 123456789.98;
System.err.println(num); //输出结果:1.2345678998E8
java.text.NumberFormat NF = java.text.NumberFormat.getInstance();
NF.setGroupingUsed(false);//去掉科学计数法显示
System.err.println("d:="+NF.format(num)); //输出结果:d:=123456789.98
三、BigDecimal的加、减、乘、除运算
以加法为例进行演示。
Double num = 123456789.98;
Double a = num + num;
System.err.println(a); //输出结果:2.4691357996E8
BigDecimal b =new BigDecimal(a + "");
System.err.println(b); //输出结果:246913579.96
BigDecimal b1 = new BigDecimal(Double.toString(num));
BigDecimal b2 = new BigDecimal(Double.toString(num));
System.err.println(b1.add(b2).doubleValue()); //输出结果:2.4691357996E8
BigDecimal c =new BigDecimal(b1.add(b2).doubleValue()+"");
System.err.println(c); //输出结果:246913579.96
对比下结果,由此可以看出,还是应该使用先运算再转换的方式来,或使用下面这种方式。
BigDecimal c =new BigDecimal(b1.add(b2).doubleValue()+"");
System.err.println(c); //输出结果:246913579.96
减法、乘法、除法均可以使用上面的方式进行运算,其具体方法如下
b1.subtract(b2).doubleValue();//减法
b1.multiply(b2).doubleValue();//乘法
b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();//除法
总结:
1.在单纯进行Double转换BigDecimal时,通过加""(双引号),创建新的BigDecimal对象进行转换;
2.在涉及到算术运算时,先进行基本的运算,最后再将结果以1的方式转换;
3.或先将数值转换,再通过BigDecimal特定的方法进行运算,然后使用.doubleValue()+""创建新的BigDecimal对象进行转换。