BigDecimal使用および異常処理

2992 ワード

  • 商品の価格をフォーマットします.例えば、すべての商品の価格は2桁の小数
  • を保留します.
    /** * * @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    "    "       
    
  • 商品の価格を元から分に変え、フロントエンドで
  • を分けるのに便利である.
    /** *       * @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)
              ,