Float on the flow

とあるエンジニアのブログ。「ゆったり・しっかり」がモットー。

double型からBigDecimalを生成するときの注意点

Javaでdouble型からBigDecimal型を作るときは、次のようにするとよさげです。

double d = 0.1D;
DecimalFormat df = new DecimalFormat("0.#####");
BigDecimal bd = new BigDecimal(df.format(d));

(最大桁数が多いときは#の数を増やせばOK。余った#は表示されないので。)

単純に

double d = 0.1D;
BigDecimal bd = new BigDecimal(d);

とすると、JavaAPIドキュメントにもある通りの誤差が生じます。

たとえば、

0.1000000000000000055511151231257827021181583404541015625

のような感じで。値としては微小な誤差ですが、見た目上は大きく違いますね。

これを、APIドキュメントにしたがって

double d = 0.1D;
BigDecimal bd = new BigDecimal(d.toString());

とすると、誤差はなくなります。

ただ、これでも桁数が多いと

0.00010

のようになることがあるようでした。

それをDecimalFormatをかけてやることで解決したのが、最初のコードです。

http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/math/BigDecimal.html#BigDecimaldouble