スポンサード リンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサード リンク
-- : -- : -- | スポンサー広告 | page top↑
スポンサード リンク

正確な値が要求される計算にfloat,double型は使えない!

floatやdoubleといった型はコンピュータの中では2進数の浮動小数点で表現されています。そのため、0.1のようにどうしても2のべき乗では表せない(無限級数になってしまい、桁数が無限に必要)数値が多く存在します。

 0.1   0.2   0.4   0.8   0.6   0.2
x  2  x  2  x  2  x  2  x  2  x  2
――  ――  ――  ――  ――  ――
 0.2   0.4   0.8   1.6   1.2   0.4

10進: 0.1 ⇔   2進: 0.00011…

そのため、このような数値を用いて計算を行うと誤差が発生します。次の例はEffective Javaから借用したものです。

System.out.println(1.00-9*.10);

普通の感覚では0.10という答えを期待しますが、実際に出力される値は0.09999999999999998です。(*1)

このように、float型やdouble型は誤差を含む可能性があるため、科学・工学計算で多少の誤差は許容できる場合はよいのですが、金融・会計分野のように正確な値が要求される計算には向きません。

どうしても正確な値が欲しい場合は、BigDecimalクラスを使用することになります。基本データ型のdoubleやfloatと比較すると不便かつ低速ですが、精度が保証されており、丸め方も指定できます。

Effective Java プログラミング言語ガイド
Effective Java プログラミング言語ガイドJoshua Bloch

ピアソン・エデュケーション 2001-12-03
売り上げランキング : 14187
おすすめ平均star


Amazonで詳しく見る
by G-Tools

*1: Effective Javaでは0.09999999999999995が出力されると書かれています。おそらく、これは本が間違えているのではなく、実行環境の差異からきているものと思われます。


スポンサード リンク

テーマ:プログラミング - ジャンル:コンピュータ - ソーシャルブックマーク: この記事をクリップ! Yahoo!ブックマークに登録

00 : 33 : 14 | プログラミング-Java | トラックバック(0) | コメント(0) | page top↑
<<不変クラスとして設計した複素数クラスComplex(Javaによる実装) | ホーム | Javaでも起こりうるメモリリーク>>
コメント

コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
http://networkprogramming.blog18.fc2.com/tb.php/75-2878e120
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |

プロフィール

TBVector

Author:TBVector

プロフィール

メールフォーム

記事検索

Google

最近の記事

人気の記事

過去の記事

カテゴリー

タグランキング

リンク

最近のコメント

最近のトラックバック

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。