Java使用BigDecimal精确运算浮点数
/**
*进行BigDecimal对象的加减乘除,四舍五入等运算的工具类
*
*@authorMarydon
*@createTime2017年12月1日上午11:39:15
*@updateTime
*@Email:Marydon20170307@163.com
*@description由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供了精确的浮点数运算,包括加减乘除和四舍五入。
*@version:1.0.0
*/
publicclassArithmeticUtiles{
/**
*进行BigDecimal对象的加减乘除,四舍五入等运算的工具类
*
*@authorwupenghui由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入。
*/
//默认除法运算精度
privatestaticfinalintDEF_DIV_SCALE=10;
//这个类不能实例化
privateArithmeticUtiles(){
}
/**
*提供精确的加法运算
*
*@paramv1
*被加数
*@paramv2
*加数
*@return两个参数的和
*/
publicstaticdoubleadd(doublev1,doublev2){
BigDecimalb1=newBigDecimal(Double.toString(v1));
BigDecimalb2=newBigDecimal(Double.toString(v2));
returnb1.add(b2).doubleValue();
}
/**
*提供精确的减法运算
*
*@paramv1
*被减数
*@paramv2
*减数
*@return两个参数的差
*/
publicstaticdoublesub(doublev1,doublev2){
BigDecimalb1=newBigDecimal(Double.toString(v1));
BigDecimalb2=newBigDecimal(Double.toString(v2));
returnb1.subtract(b2).doubleValue();
}
/**
*提供精确的乘法运算
*
*@paramv1
*被乘数
*@paramv2
*乘数
*@return两个参数的积
*/
publicstaticdoublemul(doublev1,doublev2){
BigDecimalb1=newBigDecimal(Double.toString(v1));
BigDecimalb2=newBigDecimal(Double.toString(v2));
returnb1.multiply(b2).doubleValue();
}
/**
*提供(相对)精确的除法运算,当发生除不尽的情况时,精确到小数点以后10位,以后的数字四舍五入
*
*@paramv1
*被除数
*@paramv2
*除数
*@return两个参数的商
*/
publicstaticdoublediv(doublev1,doublev2){
returndiv(v1,v2,DEF_DIV_SCALE);
}
/**
*提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
*
*@paramv1
*被除数
*@paramv2
*除数
*@paramscale
*表示表示需要精确到小数点以后几位。
*@return两个参数的商
*/
publicstaticdoublediv(doublev1,doublev2,intscale){
if(scale<0){
thrownewIllegalArgumentException("Thescalemustbeapositiveintegerorzero");
}
BigDecimalb1=newBigDecimal(Double.toString(v1));
BigDecimalb2=newBigDecimal(Double.toString(v2));
returnb1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
*提供精确的小数位四舍五入处理。
*
*@paramv
*需要四舍五入的数字
*@paramscale
*小数点后保留几位
*@return四舍五入后的结果
*/
publicstaticdoubleround(doublev,intscale){
if(scale<0){
thrownewIllegalArgumentException("Thescalemustbeapositiveintegerorzero");
}
BigDecimalb=newBigDecimal(Double.toString(v));
BigDecimalone=newBigDecimal("1");
returnb.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
*提供精确的类型转换(Float)
*
*@paramv
*需要被转换的数字
*@return返回转换结果
*/
publicstaticfloatconvertsToFloat(doublev){
BigDecimalb=newBigDecimal(v);
returnb.floatValue();
}
/**
*提供精确的类型转换(Int)不进行四舍五入
*
*@paramv
*需要被转换的数字
*@return返回转换结果
*/
publicstaticintconvertsToInt(doublev){
BigDecimalb=newBigDecimal(v);
returnb.intValue();
}
/**
*提供精确的类型转换(Long)
*
*@paramv
*需要被转换的数字
*@return返回转换结果
*/
publicstaticlongconvertsToLong(doublev){
BigDecimalb=newBigDecimal(v);
returnb.longValue();
}
/**
*返回两个数中大的一个值
*
*@paramv1
*需要被对比的第一个数
*@paramv2
*需要被对比的第二个数
*@return返回两个数中大的一个值
*/
publicstaticdoublereturnMax(doublev1,doublev2){
BigDecimalb1=newBigDecimal(v1);
BigDecimalb2=newBigDecimal(v2);
returnb1.max(b2).doubleValue();
}
/**
*返回两个数中小的一个值
*
*@paramv1
*需要被对比的第一个数
*@paramv2
*需要被对比的第二个数
*@return返回两个数中小的一个值
*/
publicstaticdoublereturnMin(doublev1,doublev2){
BigDecimalb1=newBigDecimal(v1);
BigDecimalb2=newBigDecimal(v2);
returnb1.min(b2).doubleValue();
}
/**
*精确对比两个数字
*
*@paramv1
*需要被对比的第一个数
*@paramv2
*需要被对比的第二个数
*
*@return如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1
*/
publicstaticintcompareTo(doublev1,doublev2){
BigDecimalb1=newBigDecimal(v1);
BigDecimalb2=newBigDecimal(v2);
returnb1.compareTo(b2);
}
}
以上就是Java使用BigDecimal精确运算浮点数的详细内容,更多关于Java精确运算浮点数的资料请关注毛票票其它相关文章!