回答:
以下からのJavaの11 BigDecimal
のドキュメント:
MathContext
オブジェクトに精度設定0が指定されている場合(たとえば、MathContext.UNLIMITED
)、MathContext
オブジェクトを取らない算術メソッドと同様に、算術演算は正確です。(これは、5より前のリリースでサポートされていた唯一の動作です。)正確な結果の計算の結果として、
MathContext
精度設定が0のオブジェクトの丸めモード設定は使用されないため、無関係です。除算の場合、正確な商は無限に長い10進展開を持つことができます。たとえば、1を3で割った値です。商に10進展開がなく、演算が正確な結果を返すように指定されている場合、
ArithmeticException
がスローされます。それ以外の場合は、他の演算と同様に、除算の正確な結果が返されます。
修正するには、次のようにする必要があります。
a.divide(b, 2, RoundingMode.HALF_UP)
ここで、2はスケールで、RoundingMode.HALF_UPは丸めモードです。
詳細については、このブログ投稿を参照してください。
できるよ
a.divide(b, MathContext.DECIMAL128)
必要なビット数を32、64、128から選択できます。
このリンクをチェックしてください:
そのような問題を修正するために、私は以下のコードを使用しました
a.divide(b, 2, RoundingMode.HALF_EVEN)
2は精度です。これで問題は解決しました。
私のコード行が次のとおりだったので、私はこれと同じ問題を抱えていました:
txtTotalInvoice.setText(var1.divide(var2).doubleValue() + "");
前の回答を読んで、これに変更します。これは、小数精度を記述していなかったためです。
txtTotalInvoice.setText(var1.divide(var2,4, RoundingMode.HALF_UP).doubleValue() + "");
4はDecimal Precison
AND RoundingModeはEnum定数であり、このいずれかを選択できます
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
この場合、HALF_UPは次の結果になります。
2.4 = 2
2.5 = 3
2.7 = 3
RoundingMode
ここで情報を確認できます:http : //www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/
結果を四捨五入する問題ですが、私にとっての解決策は次のとおりです。
divider.divide(dividend,RoundingMode.HALF_UP);
BigDecimalの回答がArithmeticExceptionをスローする
public static void main(String[] args) {
int age = 30;
BigDecimal retireMentFund = new BigDecimal("10000.00");
retireMentFund.setScale(2,BigDecimal.ROUND_HALF_UP);
BigDecimal yearsInRetirement = new BigDecimal("20.00");
String name = " Dennis";
for ( int i = age; i <=65; i++){
recalculate(retireMentFund,new BigDecimal("0.10"));
}
BigDecimal monthlyPension = retireMentFund.divide(
yearsInRetirement.divide(new BigDecimal("12"), new MathContext(2, RoundingMode.CEILING)), new MathContext(2, RoundingMode.CEILING));
System.out.println(name+ " will have £" + monthlyPension +" per month for retirement");
}
public static void recalculate (BigDecimal fundAmount, BigDecimal rate){
fundAmount.multiply(rate.add(new BigDecimal("1.00")));
}
MathContextオブジェクトをdivideメソッド呼び出しに追加し、精度と丸めモードを調整します。これで問題が解決します
プログラムは、10進数が使用する精度を知らないため、以下をスローします。
java.lang.ArithmeticException: Non-terminating decimal expansion
MathContext precision = new MathContext(int setPrecisionYouWant); // example 2
BigDecimal a = new BigDecimal("1.6",precision);
BigDecimal b = new BigDecimal("9.2",precision);
a.divide(b) // result = 0.17