2010年7月6日火曜日

BigDecimalの計算について

JavaでBigDecimalのインスタンス生成時にコンストラクタに渡す引数によって、誤差が発生する場合がある。
  • BigDecimal value = new BigDecimal(0.0);
  • BigDecimal value = new BigDecimal("0.0");
このオブジェクトに0.1をfor文を使って10回加算する。

for (int i = 0; i < 10; i++)
value = value.add(mod);



この場合、変数modには、BigDecimalインスタンスを生成する際に、プリミティブか文字列かに応じて、0.1または、"0.1"を設定したBigDecimalのインスタンスを生成して設定する。そして、この処理を実行すると結果は以下の通りになる。また、ここでは記述していないが、double型で同様の加算処理を行った場合の結果も添えておく。
  • double : 0.9999999999999999
  • BigDecimal(プリミティブ) : 1.0000000000000000555111512312578270211815834045410156250
  • BigDecimal(String) : 1.0
doubleについては、明らかな計算誤差が出る。BigDecimalについては、四捨五入する桁数や、計算回数などに応じて誤差が出る可能性がある。Stringについては、理想の結果となっている。はっきりしたことは言えないが、BigDecimalを使うときにはStringに変換した方が良いということになるのかどうか。

0 件のコメント:

コメントを投稿