Java编程BigDecimal用法实例分享
Java中提供了大数字(超过16位有效位)的操作类,即java.math.BinInteger类和java.math.BigDecimal类,用于高精度计算.
其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类.
BigDecimal类的实现用到了BigInteger类,不同的是BigDecimal加入了小数的概念.
float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用BigInteger类和BigDecimal类,它支持任何精度的定点数,可以用它来精确计算货币值.
BigDecimal类创建的是对象,不能使用传统的+、-、*、/等算术运算符直接对其进行数学运算,而必须调用其对应的方法.方法的参数也必须是BigDecimal类型的对象.
构造BigDecimal对象常用以下方法:
BigDecimalBigDecimal(doubled);//不允许使用
BigDecimalBigDecimal(Strings);//常用,推荐使用
staticBigDecimalvalueOf(doubled);//常用,推荐使用
其中,
1.double参数的构造方法,不允许使用!!!!因为它不能精确的得到相应的值;
2.String构造方法是完全可预知的:写入newBigDecimal("0.1")将创建一个BigDecimal,它正好等于预期的0.1;因此,通常建议优先使用String构造方法;
3.静态方法valueOf(doubleval)内部实现,仍是将double类型转为String类型;这通常是将double(或float)转化为BigDecimal的首选方法;
测试代码如下:
publicstaticvoidmain(String[]args){ doubled1=0.10334; doubled2=1234.0; System.out.println("newBigDecimal("+d1+")="+newBigDecimal(d1));//此种方式绝对不允许!!!!! System.out.println("newBigDecimal("+d2+")="+newBigDecimal(d2));//此种方式绝对不允许!!!!! System.out.println(""); System.out.println("newBigDecimal(String.valueOf("+d1+"))="+newBigDecimal(String.valueOf(d1))); System.out.println("newBigDecimal(String.valueOf("+d2+"))="+newBigDecimal(String.valueOf(d2))); System.out.println(""); System.out.println("newBigDecimal(String.valueOf("+d1+"))="+newBigDecimal(Double.toString(d1))); System.out.println("newBigDecimal(String.valueOf("+d2+"))="+newBigDecimal(Double.toString(d2))); System.out.println(""); System.out.println("BigDecimal.valueOf("+d1+")="+BigDecimal.valueOf(d1)); System.out.println("BigDecimal.valueOf("+d2+")="+BigDecimal.valueOf(d2)); System.out.println(""); BigDecimalb1=BigDecimal.valueOf(1); BigDecimalb2=BigDecimal.valueOf(1.00000); System.out.println(b1.equals(b2)); System.out.println(b1.compareTo(b2)); }
输出如下:
newBigDecimal(0.10334)=0.10334000000000000130118138486068346537649631500244140625 newBigDecimal(1234.0)=1234 newBigDecimal(String.valueOf(0.10334))=0.10334 newBigDecimal(String.valueOf(1234.0))=1234.0 newBigDecimal(String.valueOf(0.10334))=0.10334 newBigDecimal(String.valueOf(1234.0))=1234.0 BigDecimal.valueOf(0.10334)=0.10334 BigDecimal.valueOf(1234.0)=1234.0 false 0
附1,BigDecimal类的valueOf()方法源码
publicstaticBigDecimalvalueOf(doubleval){ returnnewBigDecimal(Double.toString(val)); }
附2,BigDecimal类的几个常用方法
/** *求余数 *返回值为(this%divisor)的BigDecimal */ BigDecimalremainder(BigDecimaldivisor); /** *求相反数 *返回值是(-this)的BigDecimal */ BigDecimalnegate(); /** *将此BigDecimal与指定的BigDecimal比较 *根据此方法,值相等但具有不同标度的两个BigDecimal对象(如,2.0和2.00)被认为是相等的; *相对六个boolean比较运算符(<,==,>,>=,!=,<=)中每一个运算符的各个方法,优先提供此方法; *建议使用以下语句执行上述比较:(x.compareTo(y)0),其中 是六个比较运算符之一; * *指定者:接口Comparable 中的compareTo *返回:当此BigDecimal在数字上小于、等于或大于val时,返回-1、0或1 */ intcompareTo(BigDecimalval);
附3,提供精确的浮点数运算(包括加、减、乘、除、四舍五入)的工具类源码
packagecom.util; importjava.math.BigDecimal; /** *提供精确的浮点数运算(包括加、减、乘、除、四舍五入)工具类 */ publicclassArithUtil{ //除法运算默认精度 privatestaticfinalintDEF_DIV_SCALE=10; privateArithUtil(){ } /** *精确加法 */ publicstaticdoubleadd(doublevalue1,doublevalue2){ BigDecimalb1=BigDecimal.valueOf(value1); BigDecimalb2=BigDecimal.valueOf(value2); returnb1.add(b2).doubleValue(); } /** *精确减法 */ publicstaticdoublesub(doublevalue1,doublevalue2){ BigDecimalb1=BigDecimal.valueOf(value1); BigDecimalb2=BigDecimal.valueOf(value2); returnb1.subtract(b2).doubleValue(); } /** *精确乘法 */ publicstaticdoublemul(doublevalue1,doublevalue2){ BigDecimalb1=BigDecimal.valueOf(value1); BigDecimalb2=BigDecimal.valueOf(value2); returnb1.multiply(b2).doubleValue(); } /** *精确除法使用默认精度 */ publicstaticdoublediv(doublevalue1,doublevalue2)throwsIllegalAccessException{ returndiv(value1,value2,DEF_DIV_SCALE); } /** *精确除法 *@paramscale精度 */ publicstaticdoublediv(doublevalue1,doublevalue2,intscale)throwsIllegalAccessException{ if(scale<0){ thrownewIllegalAccessException("精确度不能小于0"); } BigDecimalb1=BigDecimal.valueOf(value1); BigDecimalb2=BigDecimal.valueOf(value2); //returnb1.divide(b2,scale).doubleValue(); returnb1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } /** *四舍五入 *@paramscale小数点后保留几位 */ publicstaticdoubleround(doublev,intscale)throwsIllegalAccessException{ returndiv(v,1,scale); } /** *比较大小 */ publicstaticbooleanequalTo(BigDecimalb1,BigDecimalb2){ if(b1==null||b2==null){ returnfalse; } return0==b1.compareTo(b2); } }
下面,总结下这次项目中BigDecimal的用法。
1.加减乘除
2.设置精度
3.取反
加减乘除分别调用函数
publicBigDecimaladd(BigDecimalvalue); publicBigDecimalsubtract(BigDecimalvalue); publicBigDecimalmultiply(BigDecimalvalue); publicBigDecimaldivide(BigDecimalvalue);
举例:
BigDecimala=newBigDecimal(10.0); BigDecimalb=newBigDecimal(9.1); System.out.println(a.subtract(b));
精度设置,为什么会设置精度,给大家看个效果
代码如下
BigDecimalabig=newBigDecimal(10.0); BigDecimalbbig=newBigDecimal(9.1); BigDecimalcbig=newBigDecimal(8.9); System.out.println(abig.subtract(bbig)); System.out.println(abig.subtract(cbig));
结果如下:
0.9000000000000003552713678800500929355621337890625 1.0999999999999996447286321199499070644378662109375
并不是我们希望看到的0.9和1.1,原因就是转成二进制的时候会有精度问题,导致这样的结果。所以我们可以在运算的时候加精度,也可以在实例化BigDecimal的时候用字符串。
设置精度的方法:
System.out.println(abig.subtract(bbig).setScale(2,BigDecimal.ROUND_HALF_UP)); System.out.println(abig.subtract(cbig).setScale(2,BigDecimal.ROUND_HALF_UP));
这样设置两位精度就可以啦
0.90 1.10
字符串实例化的方法:
BigDecimalabig=newBigDecimal("10.0"); BigDecimalbbig=newBigDecimal("9.1"); BigDecimalcbig=newBigDecimal("8.9");
取反
因为Bigdecimal是无法直接用+-*/这些符号进行计算的,所以取反的时候也需要一个单独的方法来实现:
System.out.println(abig.negate());
这样就会拿到它的相反数了:
-10.0
这些是这次项目中用到的点
总结
以上就是本文关于Java编程BigDecimal用法实例分享的全部内容,希望对大家有所帮助。欢迎参阅:Java之dao模式详解及代码示例、java编程中自动拆箱与自动装箱详解、java数组基础详解等,有什么问题可以随时留言,欢迎大家指出!