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が放出されます.