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;

使用例

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);

      }
}

実行結果

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