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

MyMemoWiki

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

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

2020年2月16日 (日) 04:27時点における最新版

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