BigDecimalクラスに新しいグレードの丸めを実装しようとしていますが、バグが発生している可能性があります。おそらく何か間違ったことをしているに違いありません。以下のコードは私の問題を明らかにします:
public static void main(String[] args) throws IOException {
BigDecimal valDouble = new BigDecimal(0.35);
valDouble = valDouble.setScale(1, BigDecimal.ROUND_HALF_UP);
System.out.println(valDouble.doubleValue()); // prints 0.3
BigDecimal valString = new BigDecimal(new String("0.35"));
valString = valString.setScale(1, BigDecimal.ROUND_HALF_UP);
System.out.println(valString.doubleValue()); // prints 0.4
}
ここでの私の疑問は、BigDecimalはdoubleコンストラクターとStringコンストラクターで異なるのかということです。
私はこの「バグ」を理解できません。少なくとも、以下のように、単純な文字列連結を使用して「解決」しました。
BigDecimal valDouble = new BigDecimal("" + 0.35);
何がこの奇妙な振る舞いを引き起こしているのか考えてみませんか?