BigDecimalのいろいろ

BigDecimalですが、いろいろと知らないことがあることに気づきましたのでかんたんにまとめました。自分の目も程度ですので、内容は雑かもしれません。

[sourcecode language="java"]

public class SampleBigDecimal {

/**
 * @param args
 */
public static void main(String[] args) {

    BigDecimal val1 = new BigDecimal(100);
    BigDecimal val2 = new BigDecimal(100);

    System.out.println("val1 == val2 is " + (val1 == val2));
    System.out.println("val1.compareTo(val2) is " + (val1.compareTo(val2)==0));

    // 四則演算
    BigDecimal val3 = val1.add(val2);
    System.out.println("val1 + val2 = val3 : " + val3);

    val3 = val1.subtract(val2);
    System.out.println("val1 - val2 = val3 : " + val3);

    val3 = val1.multiply(val2);
    System.out.println("val1 * val2 = val3 : " + val3);

    val3 = val1.divide(val2);
    System.out.println("val1 / val2 = val3 : " + val3);

    // 切り捨て
    val1 = new BigDecimal(100.54321);
    System.out.println("小数点以下を切り捨て  val1 100.54321 : " + val1.setScale(0, BigDecimal.ROUND_DOWN));

    val1 = new BigDecimal(100.54321);
    System.out.println("小数点第1位で切り捨て  val1 100.54321 : " + val1.setScale(1, BigDecimal.ROUND_DOWN));

    // 切り上げ
    val1 = new BigDecimal(100.54321);
    System.out.println("小数点以下を切り上げ  val1 100.54321 : " + val1.setScale(0, BigDecimal.ROUND_UP));

    val1 = new BigDecimal(100.54321);
    System.out.println("小数点第1位で切り上げ  val1 100.54321 : " + val1.setScale(1, BigDecimal.ROUND_UP));

    // 四捨五入
    val1 = new BigDecimal(100.54321);
    System.out.println("小数点以下を四捨五入  val1 100.54321 : " + val1.setScale(0, BigDecimal.ROUND_HALF_UP));

    val1 = new BigDecimal(100.54321);
    System.out.println("小数点第1位で四捨五入  val1 100.54321 : " + val1.setScale(1, BigDecimal.ROUND_HALF_UP));

    // 型変換

    val1 = new BigDecimal(999999999.9999);

    System.out.println("Integer へ型変換 val1 " + val1 + " : " + val1.intValue());
    System.out.println("Double へ型変換 val1 " + val1 + " : " + val1.doubleValue());

    // DecimalFormatへ変換
    System.out.println("[DecimalFormat] " + val1 + " : " + new DecimalFormat("####0.0#############################").format(val1.doubleValue()));
    System.out.println("float へ型変換 val1 " + val1 + " : " + val1.floatValue());

}

}

-- 処理結果 val1 == val2 is false val1.compareTo(val2) is true val1 + val2 = val3 : 200 val1 - val2 = val3 : 0 val1 * val2 = val3 : 10000 val1 / val2 = val3 : 1 小数点以下を切り捨て val1 100.54321 : 100 小数点第1位で切り捨て val1 100.54321 : 100.5 小数点以下を切り上げ val1 100.54321 : 101 小数点第1位で切り上げ val1 100.54321 : 100.6 小数点以下を四捨五入 val1 100.54321 : 101 小数点第1位で四捨五入 val1 100.54321 : 100.5 Integer へ型変換 val1 999999999.99989998340606689453125 : 999999999 Double へ型変換 val1 999999999.99989998340606689453125 : 9.999999999999E8 [DecimalFormat] 999999999.99989998340606689453125 : 999999999.9999 float へ型変換 val1 999999999.99989998340606689453125 : 1.0E9

[/sourcecode]

上記内容のうち、Double型のデータを浮動小数点表記しない方法についてはこちらを参考にしました。

S029: 浮動小数 float/double – Java FAQ