| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

Java BigDecimalの罠

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

Java BigDecimalの罠

Java |

問題の発生

BigDecimalを使えば、正確な演算ができると考えてしまうかもしれないが、以下のように、doubleからBigDecimalを生成すると、正確な値にならない。

double d = 0.1d;
java.math.BigDecimal bd = new java.math.BigDecimal(d);
System.out.println(bd);

結果

0.1000000000000000055511151231257827021181583404541015625
  • 上記例は、2進数で "0.1"を完全に表現できないため、発生する。
  • 小数点以下を 1/n (n=2の乗数)の合計にて表現するため

対処

BigDecimalを文字列から生成するとか。 例

double d = 0.1d;
java.math.BigDecimal bd = new java.math.BigDecimal(String.valueOf(d));
System.out.println(bd);

結果

0.1