BigDecimal应用

BigDecimal类

双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。表5.7中列出了BigDecimal类的主要构造器和方法。

表5.7 BigDecimal类的主要构造器和方法

构造器  描 述

BigDecimal(int)创建一个具有参数所指定整数值的对象。

BigDecimal(double)创建一个具有参数所指定双精度值的对象。

BigDecimal(long)创建一个具有参数所指定长整数值的对象。

BigDecimal(String)创建一个具有参数所指定以字符串表示的数值的对象。

续表

方 法描 述

add(BigDecimal)BigDecimal对象中的值相加,然后返回这个对象。

subtract(BigDecimal)BigDecimal对象中的值相减,然后返回这个对象。

multiply(BigDecimal)BigDecimal对象中的值相乘,然后返回这个对象。

divide(BigDecimal)BigDecimal对象中的值相除,然后返回这个对象。

toString()将BigDecimal对象的数值转换成字符串。

doubleValue()将BigDecimal对象中的值以双精度数返回。

floatValue()将BigDecimal对象中的值以单精度数返回。

longValue()将BigDecimal对象中的值以长整数返回。

intValue()将BigDecimal对象中的值以整数返回。


遇到的一些问题.
1. 对商品的价格进行格式化,比如所有商品的价格保留两位小数
  
 /**
     * 
     * @param bd  商品的价格
     * @param num 保留几位小数,如num = 2
     * @return
     */
    public static String formatPrice(BigDecimal bd,int num){
        if(bd == null || num < 0){
            return null;
        }
        bd = bd.setScale(num, BigDecimal.ROUND_HALF_UP);
        return bd + "";
    }


其中BigDecimal.ROUND_HALF_UP表示采用"四舍五入"的模式处理价格

  2. 将商品的价格由元转为分,便于前端分隔展现

    /**
     * 元转换为分
     * @param bd 商品的价格
     * @return
     */
    public static String yuanToCent(BigDecimal bd){
        if(bd == null){
            return null;
        }
        bd = bd.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_EVEN);
        return bd + "";
    }


其中setScale(0, BigDecimal.ROUND_HALF_EVEN)表示采用"四舍五入"的模式处理价格,并且结果不保留小数.

  3. 获取缓存命中率

    
   /**
    * 缓存命中率
    * @return
    */
   public static String getHitRate(){
       BigDecimal a = new BigDecimal(cacheCount.longValue()*100);
       BigDecimal b = new BigDecimal(sumCount.longValue());
       if(sumCount.longValue() > 0){
           return "%" + (a.divide(b, 2, BigDecimal.ROUND_HALF_EVEN)); 
       }
       return "0";
   }


4. BigDecimal中对于等于"0"的判断
          在 BigDecimal中,new BigDecimal("0")与new BigDecimal("0.0"),new BigDecimal(0)与new BigDecimal("0.0")都是不等的.但是本质上,它们都是"0".怎么对是否等于"0"进行判断?将BigDecimal类型的值通过调用doubleValue()方法转换为double类型进行比较或通过上面的方法yuanToCent转换一下比较就能解决这个问题.

    5.  用BigDecimal进行除法计算时抛出java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常.
       比如用new BigDecimal(30).divide(new BigDecimal(7))就会抛这个异常,异常原因:BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛这个异常.
      解决办法:给divide设置精确的小数点位数或"舍入"模式,如
            new BigDecimal(30).divide(new             BigDecimal(7),BigDecimal.ROUND_HALF_UP).setScale(2,BigDecimal.ROUND_HALF_UP)或
                  new BigDecimal(30).divide(new BigDecimal(7),2,BigDecimal.ROUND_HALF_UP)
     建议采用第二种方式,因为第二种方式的结果精度更高
     
    另外,要注意BigDecimal跟String一样,是不可改变的,比如BigDecimal对象执行setScale(), add()等操作都会返回一个新的BigDecimal.


转载于: http://liudeh-009.iteye.com/blog/1837266

你可能感兴趣的:(BigDecimal)