使用BigDecimal进行精确运算

使用BigDecimal进行精确运算

   一般来说,可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象。

1 BigDecimal b1 = new BigDecimal(Double.toString(0.48));2 BigDecimal b2 = BigDecimal.valueOf(0.48);

        对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。

public BigDecimal add(BigDecimal value);                        //加法2 public BigDecimal subtract(BigDecimal value);                   //减法 3 public BigDecimal multiply(BigDecimal value);                   //乘法4 public BigDecimal divide(BigDecimal value);                     //除法

保留小数:

BigDecimal.setScale() 方法用于格式化小数点

setScale(1) 表示保留一位小数,默认用四舍五入

setScale(1,BigDecimal.ROUND_DOWN)  直接删除多余的小数位

setScale(1BigDecimal.ROUND_UP)进位处理 2.35 变成2.4

setScale(1BigDecimal.ROUND_HALF_UP)四舍五入

setScale(1BigDecimal.ROUND_HALF_DOWN)    2.35变成2.3
          进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue()doubleValue()等方法。

          下面是一个工具类,该工具类提供加,减,乘,除运算。

 

 1 public class Arith {     

/** 

  * 提供精确加法计算的add方法      

* @param value1 被加数      

* @param value2 加数      

  * @return 两个参数的和       

*/    

public static double add(double value1,double value2){         

 BigDecimal b1 = new BigDecimal(Double.valueOf(value1));     

BigDecimal b2 = new BigDecimal(Double.valueOf(value2));   

      return b1.add(b2).doubleValue();

   }    

/**      

* 提供精确减法运算的sub方法 

* @param value1 被减数      

* @param value2 减数1   

* @return 两个参数的差     

*/20     

public static double sub(double value1,double value2){

  BigDecimal b1 = new BigDecimal(Double.valueOf(value1));        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));

         return b1.subtract(b2).doubleValue();

   }   

 /**     

 * 提供精确乘法运算的mul方法   

   * @param value1 被乘数   

   * @param value2 乘数

    * @return 两个参数的积   

   */    

 public static double mul(double value1,double value2){

    BigDecimal b1 = new BigDecimal(Double.valueOf(value1));         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));

         return b1.multiply(b2).doubleValue();   

  }    

 /**   

   * 提供精确的除法运算方法div  

    * @param value1 被除数  

    * @param value2 除数  

    * @param scale 精确范围 

     * @return 两个参数的商  

   * @throws IllegalAccessException   

   */   

 public static double div(double value1,double value2,int scale) throws IllegalAccessException{

   //如果精确范围小于0,抛出异常信息

  if(scale<0){

throw new IllegalAccessException("精确度不能小于0");

     }      

  BigDecimal b1 = new BigDecimal(Double.valueOf(value1));         BigDecimal b2 = new BigDecimal(Double.valueOf(value2));

         return b1.divide(b2, scale).doubleValue();   

   }

 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值