码迷,mamicode.com
首页 > 其他好文 > 详细

BigDecimal在实际项目的应用及遇到的问题(转)

时间:2015-04-24 11:59:21      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

 我们都知道,java中对大小数,高精度的计算都会用到BigDecimal.但是在实际应用中,运用BigDecimal还是会遇到一些问题.下面说一下我在项目中怎么样BigDecimal和遇到的一些问题. 

 

       1. 对商品的价格进行格式化,比如所有商品的价格保留两位小数

      

Java代码  技术分享
  1. /** 
  2.  *  
  3.  * @param bd  商品的价格 
  4.  * @param num 保留几位小数,如num = 2 
  5.  * @return 
  6.  */  
  7. public static String formatPrice(BigDecimal bd,int num){  
  8.     if(bd == null || num < 0){  
  9.         return null;  
  10.     }  
  11.     bd = bd.setScale(num, BigDecimal.ROUND_HALF_UP);  
  12.     return bd + "";  
  13. }  

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

 

 

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

   

Java代码  技术分享
  1. /** 
  2.  * 元转换为分 
  3.  * @param bd 商品的价格 
  4.  * @return 
  5.  */  
  6. public static String yuanToCent(BigDecimal bd){  
  7.     if(bd == null){  
  8.         return null;  
  9.     }  
  10.     bd = bd.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_EVEN);  
  11.     return bd + "";  
  12. }  

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

 

 

  3. 获取缓存命中率

     

Java代码  技术分享
  1. /** 
  2.  * 缓存命中率 
  3.  * @return 
  4.  */  
  5. public static String getHitRate(){  
  6.     BigDecimal a = new BigDecimal(cacheCount.longValue()*100);  
  7.     BigDecimal b = new BigDecimal(sumCount.longValue());  
  8.     if(sumCount.longValue() > 0){  
  9.         return "%" + (a.divide(b, 2, BigDecimal.ROUND_HALF_EVEN));   
  10.     }  
  11.     return "0";  
  12. }  

 

 

  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.

 

原帖地址:http://blog.csdn.net/liuxuejin/article/details/8730621

BigDecimal在实际项目的应用及遇到的问题(转)

标签:

原文地址:http://www.cnblogs.com/tomato2014/p/4452791.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!