BigDecimal四則演算と精度計算


文書ディレクトリ

  • 一、四則演算
  • 二、精度計算
  • 一、四則演算

        //  
        @Test
        public void test1() {
            BigDecimal num1 = new BigDecimal(4);
            BigDecimal num2 = new BigDecimal(2);
    
            //  add
            BigDecimal resultAdd = num1.add(num2);
            //  subtract
            BigDecimal resultSubtract = num1.subtract(num2);
            //  multiply
            BigDecimal resultMultiply = num1.multiply(num2);
            //  divide
            BigDecimal resultDivide = num1.divide(num2);
    
            System.out.println(" :" + resultAdd);
            System.out.println(" :" + resultSubtract);
            System.out.println(" :" + resultMultiply);
            System.out.println(" :" + resultDivide);
        }
    

    結果:
     :6
     :2
     :8
     :2
    

    二、精度計算

        //  
        @Test
        public void test2() {
            BigDecimal num1 = new BigDecimal(1);
            BigDecimal num2 = new BigDecimal(3);
    
            try {
                BigDecimal resultDivide = num1.divide(num2).setScale(2, BigDecimal.ROUND_HALF_UP);
                System.out.println(" :" + resultDivide);
            } catch (Exception e) {
                System.out.println(" :" + e.getMessage());
            }
    
            BigDecimal resultDivide = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
            System.out.println(" :" + resultDivide);
        }
    

    結果:
     :Non-terminating decimal expansion; no exact representable decimal result.
     :0.33
    

    以上より進捗が失われた場合に異常が発生することが分かるが,演算時に進捗演算を行うことは問題ないが,ここでは精度計算方式を用い,ここではBigDecimal.ROUND_HALF_UPが四捨五入である.
    その他の精度方法:
    1、ROUND_UP
    切り上げモードでは、切り捨てた数にかかわらず上へ進みます
    2、ROUND_DOWN
    切り捨てモードでは、切り捨てた数にかかわらず進位しません
    3、ROUND_CEILING
    BigDecimalが正の場合、丸め動作とROUND_UP同じ;
    BigDecimalが負の場合、丸め動作はROUND_DOWNは同じです.
    4、ROUND_FLOOR
    BigDecimalが正の場合、丸め動作とROUND_DOWNは同じです.
    BigDecimalが負の場合、丸め動作はROUND_UPは同じです.
    5、ROUND_HALF_UP
    四捨五入モード
    6、ROUND_HALF_DOWN
    五捨六入モード
    7、ROUND_HALF_EVEN銀行家捨入法
    「最も近い」数値に切り込み、隣接する2つの数値の距離が等しい場合は、隣接する偶数に切り込みます.
    切り捨て部分の左の数字が奇数の場合、切り捨て動作とROUND_HALF_UP同じ;
    偶数の場合は、丸め動作とROUND_HALF_DOWNは同じです.
    なお、一連の計算を繰り返すと、この丸めモードでは、累積エラーを最小限に抑えることができます.
    この丸めモードは「銀行家丸め法」とも呼ばれ、主に米国で使用されています.四捨六入、五分二の場合.
    前のビットが奇数の場合は、ビットが入り、そうでない場合は切り捨てられます.
    以下の例は、小数点1ビットを保持する場合、このような切り込み方式の結果である.
    1.15>1.2 1.25>1.2
    8、ROUND_UNNECESSARY
    アサーション要求の操作には正確な結果があるため、切り捨てる必要はありません.
    正確な結果を得る操作に対してこの丸めモードを指定すると、ArithmeticExceptionが放出されます.