Rainbow Planet

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のabstractとは?抽象クラスの概要やサンプルPGをご紹介

<目次> (1) Javaのabstractとは?抽象クラスの概要やサンプルPGをご紹介  (1-1) 抽象クラス(abstract)とは  (1-2) 抽象クラスの目的や用途  (1-3) 抽象クラ …

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

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

WindowsのcmdからJavaファイルを作成・コンパイル・実行する方法

“Windows”の「コマンドプロンプト」からJavaファイルを作成・コンパイル・実行する方法について記述します。今回の操作は全てコマンドラインインターフェイスから実施いたしま …

Javaのアノテーションとは?種類や使い方についてご紹介

<目次> (1) Javaのアノテーションとは?自作の手順やフィールド値の取得方法もご紹介  (1-1) アノテーションとは?  (1-2) アノテーションの種類  (1-3) 自作アノテーションの作 …

JSPやServletの画面をスマホ表示に対応させる方法~メディアクエリの導入~

<目次> (1) JSPやServletの画面をスマホ表示に対応させる方法 (2) 設定手順  (2-1) Step1:ビューポートの設定  (2-2) Step2:メディアクエリを記述したcssファ …

  • English (United States)
  • 日本語
Top