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表示采用"四舍五入"的模式处理价格
  1. 将商品的价格由元转为分,便于前端分隔展现
/** 
 * 元转换为分 
 * @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)表示采用"四舍五入"的模式处理价格,并且结果不保留小数.

异常处理:
用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)
 建议采用第二种方式,因为第二种方式的结果精度更高

转载于:https://www.cnblogs.com/shiguangmanbu2016/p/5932913.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值