Javaで正確な数値計算を行うため BigDecimal を使っていたが、BigDecimalをdoubleで初期化したあと、小数点以下で四捨五入したところ誤差が出てしまった。

BigDecimalで誤差が出てしまった話 - たけぼーの備忘録

BigDecimalを使用して正確な数値計算を行う場合、doubleで初期化することは避けたほうが良いです。doubleは浮動小数点数であり、多くの10進数は正確に表現できません。そのため、doubleで初期化したBigDecimalはすでに誤差を含んでいる可能性があります。

BigDecimalを初期化する際には、String型の値やBigInteger型の値を利用してください。例えば:

BigDecimal bd = new BigDecimal("123.456");
 

この方法で初期化すると、BigDecimalは正確な10進数値を保持します。

小数点以下で四捨五入を行う場合は、setScaleメソッドを使用し、RoundingModeを指定します。

import java.math.BigDecimal;
import java.math.RoundingMode;
 
public class Main {
    public static void main(String[] args) {
        BigDecimal bd = new BigDecimal("123.456");
        BigDecimal rounded = bd.setScale(2, RoundingMode.HALF_UP);
        System.out.println(rounded);
    }
}

この例では、小数点以下2桁で四捨五入された結果が得られます。正確な数値計算を行うためには、BigDecimalの初期化と四捨五入の両方で適切な方法を使用してください。