zoukankan      html  css  js  c++  java
  • 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)
     建议采用第二种方式,因为第二种方式的结果精度更高
    
  • 相关阅读:
    [原][osg]Geometry详解
    [osg]节点遍历nodevisitor浅析
    [原][osg]osgconv浅析
    [原][游戏][攻略]仙之侠道玖章-- --从入门到放弃
    [转][linux]简单的linux下的tcp/udp
    [转][c++][跨平台]c++跨平台开发小结
    人机交互,来和我猜拳吧!
    从零开始学测试【1】测试方法术语总结
    从零开始学测试【2】网页登录界面
    JSP 和 ASP.NET 谁能主宰未来【转】
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932913.html
Copyright © 2011-2022 走看看