あなたが抱えている問題は、0.1がわずかに高い数値で表されることです。
System.out.println(new BigDecimal(0.1));
版画
0.1000000000000000055511151231257827021181583404541015625
Double.toString() はこの表現エラーを考慮しているため、表示されません。
同様に、0.3 は実際よりもわずかに低い値で表されます。
0.299999999999999988897769753748434595763683319091796875
0.1 の表示値に 3 を掛けると、0.3 の表示値は得られず、代わりに少し高い値が得られます。
0.3000000000000000166533453693773481063544750213623046875
これは単なる表現誤差ではなく、演算による丸め誤差でもあります。これは、Double.toString() が修正できる範囲を超えているため、丸めエラーが表示されます。
ストーリーの教訓は、ソリューションを適切に使用するfloat
かdouble
、丸めることもできます。
double d = 0.1 + 0.1 + 0.1;
System.out.println(d);
double d2 = (long)(d * 1e6 + 0.5) / 1e6; // round to 6 decimal places.
System.out.println(d2);
版画
0.30000000000000004
0.3