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

MyMemoWiki

「Java BigDecimalの罠」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
(ページの作成:「==Java BigDecimalの罠== [Java] ====問題の発生==== BigDecimalを使えば、正確な演算ができると考えてしまうかもしれないが、以下の…」)
 
1行目: 1行目:
 
==Java BigDecimalの罠==
 
==Java BigDecimalの罠==
[Java]
+
[[Java]]
  
 
====問題の発生====
 
====問題の発生====

2020年2月15日 (土) 08:03時点における版

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