JavaにおけるBigDecimal類の常用方法


1.概要
Big Decimal類はjava.math.Big Decimalに包まれています.このような大きな小数点以下の操作ができます.また、このような正確な四捨五入も使用できます.この点は開発によく使われています.
正確な計算精度が必要でないプログラムに対しては、floatまたはdoubleを直接使用して行うことができますが、正確な計算結果が必要であれば、BigDecimalクラスを使用する必要があります.
2.Big Decimal類の常用方法
2.1.BigDecimal(String val):構造方法で、StringタイプをBigDecimalタイプのデータに変換します.
2.2.BigDecimal(double val):構造方法で、doubleタイプをBigDecimalタイプのデータに変換します.
2.3.3 BigDecimal(int val):構造方法、intタイプをBigDecimalタイプデータに変換します.
2.4.4 BigDecimal add(BigDecimal value):足し算、2つのBigDecimalタイプのデータの和を求めます.
2.52.BigDecimal subtract(BigDecimal value):減算して、2つのBigDecimalタイプのデータの差を求めます.
2.6.BigDecimal multiply(BigDecimal value):乗算して、2つのBigDecimalタイプのデータの積を求めます.
2.7.BigDecimal divide(BigDecimal divisor):除法して、2つのBigDecimalタイプのデータの商を求めます.
2.8 BigDecimal remander(BigDecimal divisor):剰余を求めて、BigDecimalタイプのデータをdivisorの剰余数で割ることを求めます.
2.9 BigDecimal max(BigDecimal value):最大数、2つのBigDecimalタイプのデータの最大値を求めます.
2.10.BigDecimal min(BigDecimal value):最も小数で、2つのBigDecimalタイプのデータの最小値を求めます.
2.11.BigDecimal abs():絶対値は、BigDecimalタイプデータの絶対値を求める.
2.2.1.2 BigDecimal negate():反対数は、BigDecimalタイプデータの反対数を求めます.
コード:
BigDecimal  a=new BigDecimal ("4.5");
        BigDecimal  b=new BigDecimal ("1.5");
        BigDecimal  c=new BigDecimal ("-10.5");
 
        BigDecimal  add_result=a.add(b);
        BigDecimal  subtract_result=a.subtract(b);
        BigDecimal  multiply_result=a.multiply(b);
        BigDecimal  divide_result=a.divide(b);
        BigDecimal  remainder_result=a.remainder(b);
        BigDecimal  max_result=a.max(b);
        BigDecimal  min_result=a.min(b);
        BigDecimal  abs_result=c.abs();
        BigDecimal  negate_result=a.negate();
 
        Log.d("TAG","4.5+1.5="+add_result);
        Log.d("TAG","4.5-1.5="+subtract_result);
        Log.d("TAG","4.5*1.5="+multiply_result);
        Log.d("TAG","4.5/1.5="+divide_result);
        Log.d("TAG","4.5/1.5  ="+remainder_result);
        Log.d("TAG","4.5 1.5   ="+max_result);
        Log.d("TAG","4.5 1.5   ="+min_result);
        Log.d("TAG","-10.5    ="+abs_result);
        Log.d("TAG","4.5    ="+negate_result);
結果:
4.5+1.5=6.0 4.5=3.0 4.5*1.5=6.75 4.5/1.5余り=0.04.5と1.5の最大数=4.5と1.5の最大数=4.5と1.5の最高小数=1.5-10.5の絶対値=10.5 4.5の逆数=4.5ここで注意したいのは除算divideです.
BigDecimal割り算は4.5/1.3のように割り切れない場合があります.java.lang.ArthmeticExceptionを間違えて報告します.Non-terminating decimal expanion;no exact representable decimal reult.
実はdivideには三つのパラメータの方法があります.
Big Decimal divide(Big Decimal divisor,int scale,int roundingMode)
第一パラメータは除数を表します.
2番目のパラメータは小数点以下の桁数を保持します.
3番目のパラメータは丸めモードを表します.割り算や四捨五入をする時にのみ切り込みモードが使用されます.
丸めパターンには以下の種類があります.
ROUND.CEILING//正無限方向に切り捨てる
ROUND.DOWN//ゼロ方向に切り捨てる
ROUND.FLOOR//負の無限方向に丸めます.
ROUND.HALF_DOWN//方向(距離)が一番近い側に切り込みます.両方の距離が等しくない限り、下に切り捨てます.例えば、1.55は小数点以下の結果を1.5とします.
ROUND.HALF_EVEN/方向(距離)が一番近い側に切り込み、両側(の距離)が同じでない限り、桁が奇数であればROUND_を使用します.HALF_UP、偶数であれば、ROUND_を使用します.HALF_DOWN
ROUND.HALF_UP//方向(距離)に一番近い側に切り込み、両側(の距離)が等しい場合を除き、上に切り込み、1.55は1桁の小数結果を1.6として残します.
ROUND.UNNECESSARY/計算結果は正確であり、丸めモードは不要です.
ROUND.UP///0離れた方向に切り込みます.
コード:
BigDecimal a=new BigDecimal("4.5");
        BigDecimal b=new BigDecimal("1.5");
        BigDecimal c=new BigDecimal("2");
 
        BigDecimal result1=a.divide(b,2,BigDecimal.ROUND_HALF_UP);
        BigDecimal result2=a.divide(c,2,BigDecimal.ROUND_HALF_UP);
        Log.d("TAG","4.5/1.5="+result1);
        Log.d("TAG","4.5/2="+result2);
結果:
4.5/1.5=3.00 4.5/2=2.25
3.Big Decimal小数点処理
需要:計算結果は三桁の小数を保留します.
コード:
 /**
         *   1
         * 0.000:        0.00:         ...
         * */
 
        double a=3.154215;
        DecimalFormat myformat=new java.text.DecimalFormat("0.000");
        String result1 = myformat.format(a);
        Log.d("TAG",a+"      :"+result1);
 
        /**
         *   2
         * #.000:        #.00:    
         * */
 
        double b=3.256321;
        DecimalFormat   df=new DecimalFormat("#.000");
        String result2=df.format(b);
        Log.d("TAG",b+"      :"+result2);
 
        /**
         * BigDecimal         
         * */
 
        double   c=3.558525;
        BigDecimal   bigDecimal=new   BigDecimal(c);
        double result3=bigDecimal.setScale(3,   BigDecimal.ROUND_HALF_UP).doubleValue();
        Log.d("TAG",c+"           :"+result3);
結果:
3.154215は三位の小数を保留します.3.154 3.321は三位の小数を保留します.3.3558525は三位の小数を保留して、四捨五入します.
4.まとめ:
(1)ビジネス計算はBigDecimalを使用する.
(2)できるだけパラメータタイプをStringの構造関数として使用します.
(3)BigDecimalは可変ではないので、各ステップの演算を行う時には新しいオブジェクトが発生しますので、加減乗除演算をする時は必ず操作後の値を保存してください.