如何做精确的计算?

​实际工作中像银行、保险等系统,都是要精确计算到小数点后XX位的。由于Java的简单类型不能提供精确的浮点运算,但是在java.math下有一个BigDecimal类可以帮助我们做精确的浮点计算,包括四则运算和四舍五入。

使用BigDecimal类型要用String来转换,比如我们要做一个加法运算,需要先将两个浮点数转为String,然后转换成BigDecimal类型调用add方法,然后把计算的BigDecimal类型结果再转换为浮点数。

 

packagechuangyeyilu;

 

importjava.math.BigDecimal;

 

/**

* 浮点数计算

*

@author Pan Chong

*

*/

publicclass FolatCompute {

 

privatestaticfinalintDEF_DIV_SCALE = 10; // 保留小数的精度

 

/**

* 加法

@param n1

@param n2

@return

*/

publicstaticdouble add(doublen1, doublen2) {

BigDecimal b1 = newBigDecimal(Double.toString(n1));

BigDecimal b2 = newBigDecimal(Double.toString(n2));

returnb1.add(b2).doubleValue();

}

 

/**

* 减法

@param n1 被减数

@param n2 减数

@return

*/

publicstaticdouble sub(doublen1, doublen2) {

BigDecimal b1 = newBigDecimal(Double.toString(n1));

BigDecimal b2 = newBigDecimal(Double.toString(n2));

returnb1.subtract(b2).doubleValue();

}

 

/**

* 乘法

@param n1 被乘数

@param n2 乘数

@return

*/

publicstaticdouble mul(doublen1, doublen2) {

BigDecimal b1 = newBigDecimal(Double.toString(n1));

BigDecimal b2 = newBigDecimal(Double.toString(n2));

returnb1.multiply(b2).doubleValue();

}

 

/**

* 除法

@param n1 被除数

@param n2 除数

@return

*/

publicstaticdouble div(doublen1, doublen2) {

return div(n1, n2, DEF_DIV_SCALE);

}

 

/**

* 除法

@param n1

@param n2

@param scale

@return

*/

publicstaticdouble div(doublen1, doublen2, intscale) {

if (scale < 0) {

thrownew IllegalArgumentException(“精度值不合法”);

}

BigDecimal b1 = newBigDecimal(Double.toString(n1));

BigDecimal b2 = newBigDecimal(Double.toString(n2));

returnb1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();

}

 

/**

* 四舍五入

@param n

@param scale

@return

*/

publicstaticdouble round(doublen, intscale) {

if (scale < 0) {

thrownew IllegalArgumentException(“精度值不合法”);

}

BigDecimal b = newBigDecimal(Double.toString(n));

BigDecimal one = new BigDecimal(“1”);

returnb.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();

}

}

 

 

 

打赏

作者:

操千曲而后晓声,观千剑而后识器

暂无关键词!