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
結果分析
引き算と割り算には差異があります。
足し算と掛け算に差異はありません。