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(JSP&サーブレット)のFORM認証を用いたログイン画面の開発

(0)目次&概説 (1) サーバー側JavaのFORM認証  (1-1) 認証の種類  (1-2) FORM認証の特徴  (1-3) FORM認証の実装概要 (2) FORM認証の実装手順  (2-1 …

RESTful APIのサンプル(Java)を作成する手順をご紹介

  <目次> (1) RESTful APIのサンプル(Java)を作成する手順をご紹介  (1-1) 作成するAPIの概要  (1-1) RESTful APIの開発用プロジェクト作成(S …

Tomcatのコネクションプールの設定手順

<目次> (1) Tomcatのコネクションプールの設定手順  (1-1) コネクションプールとは?  (1-2) コネクションプールの設定手順   (1-2-1) context.xmlの記述    …

APサーバ(Java)⇒DBサーバ(OracleDB 11g)へJDBC接続する方法まとめ

(0)目次 (1) 前提条件 (2) JDBCドライバーのインストール  (2-1) JDBCドライバーをダウンロード  (2-2) APサーバにアップロード・解凍 (3) プログラムの実装  (3- …

Javaのthisとは?コンストラクタで引数を与えている場合・メソッド引数に使われる場合もご紹介

<目次> (1) Javaのthisとは?コンストラクタに出現する場合やメソッド引数に使われる場合もご紹介  (1-1) thisとは?  (1-2) 用途1:自分自身を指定【重要】  (1-3) 用 …

  • English (United States)
  • 日本語
Top