TadaoYamaokaの日記

山岡忠夫 Home で公開しているプログラムの開発ネタを中心に書いていきます。

Javaの小数点演算

Androidで電卓アプリを作っていて、

double a = 1.1;
double b = 2.2;
System.out.println(a + b);

を計算すると、3.3になると思いきや、
3.3000000000000003
になって、予想外の結果となった。


doubleの小数点の精度の問題でこうなってしまうようだ。

確かに2進数での小数点は、

1/2 + 1/4 + 1/8 + ...

という形になるので、正確に1.1や2.2が表現できるわけではない。


解決策は、BigDecimalを使えば良いようだ。


BigDecimal big_a = new BigDecimal("1.1");
BigDecimal big_b = new BigDecimal("2.2");
System.out.println(big_a.add(big_b));

とすれば、3.3となった。

BigDecimalを初期化する際は、コンストラクタに文字列を渡さないといけない。
ここを数値すると、その時点で誤差が発生してしまうので注意が必要。