2025.06.30

計算順序による計算結果の違い

はじめに

ここでは、複数のdouble型変数を使って掛け算割り算を行い、計算の順序の違いで計算結果が異なるかを調べました。

具体的な計算例

4つのdouble型変数a、b、c、dに以下の値を代入し、

a=123.1
b=151.017
c=0.133
d=10000.0

以下の2種類の計算を行いました。

a / b * c * d
a * c / b * d

この計算に、足し算引き算は含まれていないので、計算は式の左から順に計算されていきます。

また、計算結果は同じになることを想定しています。

実際にJavaプログラムで、2つの式を計算した結果、

a / b * c * d = 1084.1362230742236
a * c / b * d = 1084.1362230742234

となりました。小数点以下の最後の数字が違っています。

計算する順番によって、計算結果が違うことが確認できました。

Javaソースコード - 計算順序の違う2つの式で計算

この2つの計算を行うJavaソースコードは以下のとおりです。

DoubleError4.java

001
002
003
004
005
006
007
008
009
010
011
012
013
public class DoubleError4 {
	public static void main( String[] args ) {
		// aとbとcに任意の値を代入
		double a = 123.1;
		double b = 151.017;
		double c = 0.133;
		double d = 10000.0;

		// 計算結果を出力
		System.out.println( a / b * c * d );
		System.out.println( a * c / b * d );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis DoubleError4.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac DoubleError4.java

実行

C:\talavax\javasample>java DoubleError4

実行結果

1084.1362230742236
1084.1362230742234

次のソースコードは、計算の途中経過を出力するJavaソースコードです。

Javaソースコード - 計算の途中経過を出力

DoubleError5.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
public class DoubleError5 {
	public static void main( String[] args ) {
		// aとbとcに任意の値を代入
		double a = 123.1;
		double b = 151.017;
		double c = 0.133;
		double d = 10000.0;

		// 計算元の値を出力
		System.out.println( "a=" + a );
		System.out.println( "b=" + b );
		System.out.println( "c=" + c );
		System.out.println( "d=" + d );

		System.out.println();

		// 計算結果を出力
		System.out.println( "a/b*c*dの途中経過を出力" );
		System.out.println( "a/b=" + a / b );
		System.out.println( "a/b*c=" + a / b * c );
		System.out.println( "a/b*c*d=" + a / b * c * d );

		System.out.println();

		System.out.println( "a*c/b*dの途中経過を出力" );
		System.out.println( "a*c=" + a * c );
		System.out.println( "a*c/b=" + a * c / b );
		System.out.println( "a*c/b*d=" + a * c / b * d );
	}
}

コンパイル ソースコードが「ANSI」の場合

C:\talavax\javasample>javac -encoding sjis DoubleError5.java

コンパイル ソースコードが「UTF-8」の場合

C:\talavax\javasample>javac DoubleError5.java

実行

C:\talavax\javasample>java DoubleError5

実行結果

a=123.1
b=151.017
c=0.133
d=10000.0

a/b*c*dの途中経過を出力
a/b=0.8151400173490402
a/b*c=0.10841362230742235
a/b*c*d=1084.1362230742236

a*c/b*dの途中経過を出力
a*c=16.3723
a*c/b=0.10841362230742234
a*c/b*d=1084.1362230742234

以下の2つの計算結果が不一致です。

a / b * c = 0.10841362230742235
a * c / b = 0.10841362230742234

以上です。

関連コンテンツ

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラムの最初に実行されるメソッドは?

2022.12.13

プログラミングで使う変数って何?

2020.03.23

Javaのプログラムを書いてみませんか?プログラムの書き方をくわしく説明しています。

2020.03.23

「Javaソースコード」から実行可能な「オブジェクトコード」に変換する方法をくわしく説明しています。

2020.03.23

Javaのプログラムを作ってみませんか?プログラミングに必要なものの用意から実行までを説明しています。

2020.03.23

Javaプログラムを作るための環境構築の仕方を解説しています

2024.09.17

計算の仕方、変数の利用、繰り返し処理、分岐処理、文字列など、Javaプログラムの基本について説明しています

2020.03.23

Javaの学習に役立つソースコードを多数紹介しています。是非、ご覧ください。

2022.09.10

Swingパッケージを使ってグラフィック表示を行う方法を解説しています。

2020.03.23

画像フォーマット形式・色・大きさ・傾きなどの変更、特定の図形(文字・記号など)を見つけたり、取り出したりする画像処理について詳しく解説。

2015.11.29

繰り返し処理を使ったJavaのソースコードサンプルを紹介しています。

2020.03.23

配列を使うJavaソースコードを多数紹介しています。

2021.05.18

数学に関係するJavaのメソッドやソースコードなどを紹介しています。

2022.10.25

三角形、台形、円などいろいろな図形の面積を計算するプログラムを紹介しています。詳しくは、記事をご覧ください。

2021.05.18

StringクラスとStringBuilderクラスを利用したプログラミングの仕方を紹介しています。

2016.12.16

いろいろなJavaのソースコードで、日付と時間を取り扱う方法を解説します

2022.12.19

Javaを使った簡単な応用プログラム(生年月日から年齢を計算プログラムなど)を紹介しています。

2022.07.07

プログラミングに関係がある情報を紹介しています。色情報の考え方、文字コード、2進数、画像フォーマットなどについて解説しています

2023.05.27

プログラミング、ITに関する用語をまとめています。

2022.10.17

日本で使われてきた伝統文様「和柄」について解説しています。

2022.07.27

レベルごとに分けられた英単語と日本語の意味の一覧表、英語を見て日本語を当てるクイズ、日本語を見て英語を当てるクイズなどを掲載しています

2025.04.26

Javaの演算子'/'を使って割り算を行った結果と注意点などについて説明。

2020.03.23

基本的な計算である足し算(加法)/引き算(減法)/掛け算(乗法)/割り算(除法)を行うプログラム作成。

2020.03.23

プログラミング言語とは?種類や特徴について説明しています。

2022.08.03

「ゆるゆるプログラム」のコンテンツを紹介しています。興味のある方はこの記事をご覧ください。

2020.03.23

広告