Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

double型で誤差が発生する件について+発生事例やサンプルプログラムも紹介

投稿日:2020年9月17日 更新日:

<目次>

(1) double型では誤差が発生する事について
 (1-1) double型は近似値を使用している
 (1-2) double型の誤差の例

(1) double型で誤差が発生する件について

(1-1) double型は近似値を使用している

double型では小数は殆どが近似値を使っているため、小数点の計算等で誤差が生じる可能性があります(±308桁を扱えるので、実用的には問題ありませんが、銀行のシステムなどお金の計算で誤差が許されないシステム開発では注意が必要です)。

具体的には「1/(2のn乗)」(及びその倍数)以外では近似値が使われます。この理由は10進数の数字をコンピュータが扱う2進数に変換する過程で「1/(2のn乗)」で割り切れない場合は、どこかで切り捨て処理が発生するためです。

(図111)

目次にもどる

(1-2) double型の誤差の例

(1-2-1) 誤差の例①:割り算

実際にdouble型の「10.0」を同じdouble型の「154.0」で割ってから、再度「154.0」を掛け算しても、元の値(10.0)には戻らずに「9.999999999999998」になってしまいます。下図は同様の事象が発生する他の例です(77、147、154他)。

(図121)

(サンプルPG)

public class IT0126_Double_Error {
        public static void main (String args[]) {
                d_err();
        }

        public static void d_err() {
                //1~1000までの中で、dで割ってdを掛けても元に戻らない数字を探す
                for(int i=1; i<1000; i++) {
                        //double型で計算をするためにiをキャストしてdouble型に変換
                        double d = (double)i;
                        //もし10.0をdで割ってから、再度dを掛けて10.0に戻らない場合
                        if((10.0/d*d)!=10.0) {
                                System.out.println("i="+i+" : "+10.0/d*d);
                        }
                }
        }
}

目次にもどる

(1-2-2) 誤差の例②:掛け算と引き算

 この例では「1.0-7.0*0.1」の結果が0.3にならず「0.29999999999999993」となります。

(サンプルPG)

public class IT0126_Double_Error2 {
        public static void main (String args[]) {
                System.out.println(1.0-7.0*0.1);
        }
}

(図122)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Javaのsynchronizedとは?ある場合とない場合のサンプルPGを比較付き

<目次> (1) Javaのsynchronizedとは?ある場合とない場合のサンプルPGを比較付き  (1-1) synchronizedの概要  (1-2) synchronizedの構文  (1 …

クッキーとは?JSPでCookieを保存&取得するサンプルプログラムと代表的なメソッド紹介

(1) セッションとは (2) クッキーとは  (2-1) 概要  (2-2) サンプルプログラム   (2-2-1) 概要&画面遷移   (2-2-2) HelloCookie.jsp   (2-2 …

CentOS7にEclipseをインストールする手順

<目次> (1) CentOS7にEclipseをインストールする手順  (1-1) JDKのインストール  (1-2) Eclipse資源のダウンロード  (1-3) Eclipseのインストール …

バイナリ―サーチとは?Javaのサンプルプログラムを用いて解説

<目次> (1) バイナリ―サーチとは?Javaのサンプルプログラムを用いて解説  (1-1) バイナリ―サーチのアルゴリズム  (1-2) バイナリ―サーチの性能(処理回数)  (1-3) バイナリ …

JFreeChartで描画したグラフをJSP/Servlet画面に表示する方法

(0)目次&概説 (1) 記事の目的  (1-1) 目的 (2) 表示方法の概要  (2-1) 表示の仕組み  (2-2) 実装の手順 (3) サンプルプログラム  (3-1) JSPのサンプルプログ …

  • English (United States)
  • 日本語
Top