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

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

関連記事

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート2:ソース解説編)

(1) 仕様について (2) ソースコード  (2-1) AccessCounter2.java   (2-1-1) サンプルPG   (2-1-2) サンプルPG解説  (2-2) DbConnec …

JavaScriptでタグを追加する方法(jQueryのtagEditorプラグインを導入)

  <目次> (1) JavaScriptでタグを追加する方法(jQueryのtagEditorプラグインを導入)  (1-1) 概要  (1-2) tagEditorの導入方法  (1-3 …

JavaのBigDecimalの使い方+初期化・四則演算・余り・累乗等の主要用途も紹介

<目的> (1) JavaのBigDecimalの使い方+初期化や四則演算・桁数設定等の主要用途も紹介  (1-1) 宣言の方法  (1-2) 代表的な用途(足し算・引き算・掛け算・割り算)  (1- …

サーブレットとは?その役割やHelloWorldサンプルコードのご紹介

(0)目次&概説 (1) サーブレットの基本  (1-1) サーブレットとは?  (1-2) サーブレットの前身技術との比較  (1-3) サーブレットとJSPの違い  (1-4) サーブレットのHe …

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

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

  • English (United States)
  • 日本語
Top