Java BigDecimal型とdouble型の計算誤差を比較するサンプル

環境
JavaSE 11
Eclipse 4.26.0

説明
1.計算誤差
BigDecimal型 誤差が発生しない
double型 誤差が発生します

2.BigDecimal型とdouble型の変数宣言
変数の宣言
BigDecimal 変数名 = BigDecimal.valueOf(数値);
double  変数名 = 数値;

3.BigDecimal型とdouble型のメソッド
例 引き算
BigDecimal 結果の変数 = bdA.subtract(bdB);
double  結果の変数= dbA – dbB;

使用例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package com.arkgame.study;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class DemoTest {
public static void main(String[] args) {
// double型の変数
double dbA = 1;
double dbB = 0.9;
// BigDecimal型の変数
BigDecimal bdA = BigDecimal.ONE;
BigDecimal bdB = BigDecimal.valueOf(0.9);
System.out.println("double型とBigDecimal型の計算結果の違いを確認する結果");
//足し算
double dbAddres = dbA + dbB;
// 引き算
double dbSubres = dbA - dbB;
// 掛け算
double dbMulres = dbA * dbB;
// 割り算
double dbDevres = dbA / dbB;
        
//足し算
BigDecimal bigDecimalAdd = bdA.add(bdB);
// 引き算
BigDecimal bigDecimalSub = bdA.subtract(bdB);
// 掛け算
BigDecimal bigDecimalMul = bdA.multiply(bdB);
// 割り算
BigDecimal bigDecimalDev = bdA.divide(bdB, 3, RoundingMode.HALF_UP);
System.out.println("*********足し算(double、BigDecimal)の結果*********");
System.out.println("double型  :" + dbAddres);
System.out.println("BigDecimal型:" + bigDecimalAdd);
System.out.println("\n*********引き算(double、BigDecimal)の結果*********");
System.out.println("double型  :" + dbSubres);
System.out.println("BigDecimal型:" + bigDecimalSub);
System.out.println("\n*********掛け算(double、BigDecimal)の結果*********");
System.out.println("double型  :" + dbMulres);
System.out.println("BigDecimal型:" + bigDecimalMul);
System.out.println("\n*********割り算(double、BigDecimal)の結果*********");
System.out.println("double型  :" + dbDevres);
System.out.println("BigDecimal型:" + bigDecimalDev);
}
}
package com.arkgame.study; import java.math.BigDecimal; import java.math.RoundingMode; public class DemoTest { public static void main(String[] args) { // double型の変数 double dbA = 1; double dbB = 0.9; // BigDecimal型の変数 BigDecimal bdA = BigDecimal.ONE; BigDecimal bdB = BigDecimal.valueOf(0.9); System.out.println("double型とBigDecimal型の計算結果の違いを確認する結果"); //足し算 double dbAddres = dbA + dbB; // 引き算 double dbSubres = dbA - dbB; // 掛け算 double dbMulres = dbA * dbB; // 割り算 double dbDevres = dbA / dbB;          //足し算 BigDecimal bigDecimalAdd = bdA.add(bdB); // 引き算 BigDecimal bigDecimalSub = bdA.subtract(bdB); // 掛け算 BigDecimal bigDecimalMul = bdA.multiply(bdB); // 割り算 BigDecimal bigDecimalDev = bdA.divide(bdB, 3, RoundingMode.HALF_UP); System.out.println("*********足し算(double、BigDecimal)の結果*********"); System.out.println("double型  :" + dbAddres); System.out.println("BigDecimal型:" + bigDecimalAdd); System.out.println("\n*********引き算(double、BigDecimal)の結果*********"); System.out.println("double型  :" + dbSubres); System.out.println("BigDecimal型:" + bigDecimalSub); System.out.println("\n*********掛け算(double、BigDecimal)の結果*********"); System.out.println("double型  :" + dbMulres); System.out.println("BigDecimal型:" + bigDecimalMul); System.out.println("\n*********割り算(double、BigDecimal)の結果*********"); System.out.println("double型  :" + dbDevres); System.out.println("BigDecimal型:" + bigDecimalDev); } }
package com.arkgame.study;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class DemoTest {

      public static void main(String[] args) {

            // double型の変数
            double dbA = 1;
            double dbB = 0.9;

            // BigDecimal型の変数
            BigDecimal bdA = BigDecimal.ONE;
            BigDecimal bdB = BigDecimal.valueOf(0.9);

            System.out.println("double型とBigDecimal型の計算結果の違いを確認する結果");
            //足し算
            double dbAddres = dbA + dbB;
            // 引き算
            double dbSubres = dbA - dbB;
            // 掛け算
            double dbMulres = dbA * dbB;
            // 割り算
            double dbDevres = dbA / dbB;
        
            //足し算
            BigDecimal bigDecimalAdd = bdA.add(bdB);
            // 引き算
            BigDecimal bigDecimalSub = bdA.subtract(bdB);
            // 掛け算
            BigDecimal bigDecimalMul = bdA.multiply(bdB);
            // 割り算
            BigDecimal bigDecimalDev = bdA.divide(bdB, 3, RoundingMode.HALF_UP);

            System.out.println("*********足し算(double、BigDecimal)の結果*********");
            System.out.println("double型  :" + dbAddres);
            System.out.println("BigDecimal型:" + bigDecimalAdd);

            System.out.println("\n*********引き算(double、BigDecimal)の結果*********");
            System.out.println("double型  :" + dbSubres);
            System.out.println("BigDecimal型:" + bigDecimalSub);

            System.out.println("\n*********掛け算(double、BigDecimal)の結果*********");
            System.out.println("double型  :" + dbMulres);
            System.out.println("BigDecimal型:" + bigDecimalMul);

            System.out.println("\n*********割り算(double、BigDecimal)の結果*********");
            System.out.println("double型  :" + dbDevres);
            System.out.println("BigDecimal型:" + bigDecimalDev);

      }
}

実行結果

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
double型とBigDecimal型の計算結果の違いを確認する結果
*********足し算(double、BigDecimal)の結果*********
double型  :1.9
BigDecimal型:1.9
*********引き算(double、BigDecimal)の結果*********
double型  :0.09999999999999998
BigDecimal型:0.1
*********掛け算(double、BigDecimal)の結果*********
double型  :0.9
BigDecimal型:0.9
*********割り算(double、BigDecimal)の結果*********
double型  :1.1111111111111112
BigDecimal型:1.111
double型とBigDecimal型の計算結果の違いを確認する結果 *********足し算(double、BigDecimal)の結果********* double型  :1.9 BigDecimal型:1.9 *********引き算(double、BigDecimal)の結果********* double型  :0.09999999999999998 BigDecimal型:0.1 *********掛け算(double、BigDecimal)の結果********* double型  :0.9 BigDecimal型:0.9 *********割り算(double、BigDecimal)の結果********* double型  :1.1111111111111112 BigDecimal型:1.111
double型とBigDecimal型の計算結果の違いを確認する結果
*********足し算(double、BigDecimal)の結果*********
double型  :1.9
BigDecimal型:1.9

*********引き算(double、BigDecimal)の結果*********
double型  :0.09999999999999998
BigDecimal型:0.1

*********掛け算(double、BigDecimal)の結果*********
double型  :0.9
BigDecimal型:0.9

*********割り算(double、BigDecimal)の結果*********
double型  :1.1111111111111112
BigDecimal型:1.111

結果分析
引き算と割り算には差異があります。
足し算と掛け算に差異はありません。

Java

Posted by arkgame