Javaで小数を含む値を計算する際の注意点について記載しています。
目次
BigDecimal型で計算する際の注意点
注意点は、BigDecimalのコンストラクタの引数に
double型の値を渡すと予想外の動きをする
という点です。
1. 予想外の動き
例えば、0.1 を引数として渡して、文字列表現を確認してみると次のようになります。
1 2 3 4 5 6 |
BigDecimal num = new BigDecimal(0.1); System.out.println( num.toPlainString() ); // 実行結果 // 0.1000000000000000055511151231257827021181583404541015625 |
実行結果から、コンストラクタに渡した 0.1 が BigDecimal のインスタンス生成後に、0.100・・・となっていることが分かります。
この理由については、Oracleドキュメント(public BigDecimal(double val)) に記載があります。
2. 解決方法
この問題を解決するには、BigDecimalのコンストラクタの引数に 文字列 として値を渡します。
1 2 3 4 5 6 |
BigDecimal num = new BigDecimal("0.1"); System.out.println( num.toPlainString() ); // 実行結果 // 0.1 |
BigDecimalのコンストラクタに、文字列として値を渡すと正しく値が設定されました。
意識しないと double型 の値を渡してしまうので、注意するポイントになります。