タイトル
 メニューにないコーナーはTopからいけます
TOPJavaTIPS → This Page

BigDecimalの注意点【Java TIPS】

前提

このページに記載している内容は2013/03/12に書かれたものです。
掲載している画面や方法が将来的に変更されている場合があります。

指数表現(指数表記)

BigDecimalは値によってはtoString()で指数表現(指数表記)になってしまいます。
それを防ぎたい場合はtoPlainString()を使いましょう。

package jp.mitchy_world.bigdecimal;

import java.math.BigDecimal;

/**
 * BigDecimalの指数表記サンプル
 * 
 * @author みっちー
 */
public class BigDecimal1 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		BigDecimal bd = new BigDecimal("0.0000000123");
		System.out.println(bd.toString());
		System.out.println(bd.toPlainString());
	}
}

実行結果は以下の通り。
1.23E-8
0.0000000123
toString() は指数表記になってしまいますが
toPlainString() では少数表記になりました。

除算(割り算)


BigDecimal で除算するときは divide() メソッドを使いますが、
割り切れない値で除算するときは注意が必要です。

package jp.mitchy_world.bigdecimal;

import java.math.BigDecimal;

/**
 * BigDecimalの除算サンプル(例外発生)
 * 
 * @author みっちー
 */
public class BigDecimal2 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		BigDecimal bd1 = new BigDecimal(100);
		BigDecimal bd2 = new BigDecimal(3);
		System.out.println(bd1.divide(bd2));
	}
}

実行結果は以下の通り。
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
	at java.math.BigDecimal.divide(Unknown Source)
	at jp.mitchy_world.bigdecimal.BigDecimal2.main(BigDecimal2.java:19)

永遠に割り切れないよと例外が発生しちゃいました。

そこで、少数何桁までにするか、切り上げ・切り下げ・四捨五入などを指定してやります。
今回は少数10桁で四捨五入してみます。
package jp.mitchy_world.bigdecimal;

import java.math.BigDecimal;

/**
 * BigDecimalの除算サンプル(例外解決)
 * 
 * @author みっちー
 */
public class BigDecimal3 {
	/**
	 * メイン
	 * 
	 * @param args パラメータ
	 */
	public static void main(String[] args) {
		BigDecimal bd1 = new BigDecimal(100);
		BigDecimal bd2 = new BigDecimal(3);
		System.out.println(bd1.divide(bd2, 10, BigDecimal.ROUND_HALF_UP).toPlainString());
	}
}

実行結果は以下の通り。
33.3333333333
例外が発生せずに無事終了しましたね。

更新履歴

2013/03/12 新規作成


TOPJavaTIPS → This Page
Valid CSS!