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

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

関連記事

「サーブレットコンテナ」や「サーブレットのライフサイクル」とは?(サンプルプログラム付)

※本記事は「サーブレットとは?その役割やHelloWorldサンプルコードのご紹介」の続編です。 (0)目次&概説 (2) サーブレットコンテナの基本  (2-1) サーブレットコンテナとは?  (2 …

JavaのSpring Bootで404(Not_Found)エラーが出た時の対処方法について

  <目次> (1) JavaのSpring Bootで404(Not_Found)エラーが出た時の対処方法について  (1-1) エラー概要  (1-2) 原因  (1-3) 対処法 (1 …

Twitter APIのRate Limit Exceedエラー(code – 88)の意味について

  <目次> (1) Twitter APIのRate Limit Exceedエラー(code – 88)の意味について  (1-1) APIコールのリミット(Rate Limit)につい …

TwitterのAPIライブラリ(Twitter4j)で「いいね数」や「リツイート数」を取得する方法

<目次> (1) TwitterのAPIライブラリ(Twitter4j)で「いいね数」や「リツイート数」を取得する方法  (1-1) 構文  (1-2) サンプルプログラム (1) TwitterのA …

no image

jarファイル実行で「java.lang.ClassNotFoundException: com.sun.prism.es2.X11GLFactory」が出る原因と対策

  <目次> (1) jarファイル実行で「java.lang.ClassNotFoundException: com.sun.prism.es2.X11GLFactory」が出る原因と対策 …

  • English (United States)
  • 日本語
Top