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数组基础详解等,有什么问题可以随时留言,欢迎大家指出!