[ Java ] BigDecimal型を初期化する ( BigDecimal.ZERO )

Pocket

BigDecimal 型の変数に対して、数値 ( double 型 ) を直接的に代入して初期化しようとしても、型が違うとコンパイルエラーが発生します。Java のコンパイラはとっても厳しいのです。

スポンサーリンク

コンパイルエラーとなるコード

// BigDecimalを使用する
import java.math.BigDecimal;

// コンパイルエラーが発生する
BigDecimal bd = 0.00;   

// コンパイルエラーが発生
TestClass.java:8: エラー: 互換性のない型
BigDecimal bd = 0.00; // コンパイルエラー
^
期待値: BigDecimal
検出値: double
エラー1個

double から BigDecimal の変換はできますが、初期化は駄目だと言われます。やはり厳しいのです。

初期化の方法

BigDecimal 型を初期化するサンプルコードは以下のとおりです。

 BigDecimal bd;
 
 // 定数を使用して初期化
 bd = BigDecimal.ZERO;
 // valueOfメソッドを使用して初期化
 bd = BigDecimal.valueOf(0.0);

 // コンストラクタで初期化
 bd = new BigDecimal(0.0);

BigDecimal 型は文字列で初期化したほうが良い

BigDecimal 型を使用するからと言って誤差を完全に取り除くことはできません。 double 型や float 型を使用して初期化する時点で誤差が発生してしまう可能性があります。出来る限り String 型を引数に取るコンストラクタで初期化するようにしたほうが誤差の発生を抑制することはできますが、完全ではありません。

    BigDecimal bd;

    // double型で初期化した場合、初期化時にすでに誤差が発生する可能性あり
    bd = new BigDecimal(1234.56);
    System.out.println(bd); // 1234.55999999999994543031789362430572509765625

    // String 型であれば初期化時の誤差は抑制できる
    bd = new BigDecimal("1234.56");
    System.out.println(bd); // 1234.56

管理人は自分に甘いですが、自分に厳しい人が好きです。アドバイスは馬の耳に念仏となると思います。

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *