首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

BigDecimal在实际项目的应用及遇到的有关问题

2013-03-29 
BigDecimal在实际项目的应用及遇到的问题/**** @param bd商品的价格* @param num 保留几位小数,如num 2*

BigDecimal在实际项目的应用及遇到的问题
/** * * @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类型的值转换为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.

?

?

new BigDecimal("0.0"),new BigDecimal(0)
不等是指业务上还是程序上?compareTo方法呢?

热点排行