JavaA2Z

KAB-studio > プログラミング > JavaA2Z > BigDecimalとは

BigDecimal

日本語 大十進数クラス
英語 big decimal
ふりがな びっぐでしまる
フリガナ ビッグデシマル

解説

J2SEに含まれるクラスのひとつ。パッケージも含めたクラス名java.math.BigDecimal。
実数値を格納するためのクラス。 ただし、格納方法は浮動小数点ではない。
doubleのような浮動小数点形式で実数を処理すると、丸め誤差が生まれる。そのため、正確な値を格納するために、浮動小数点ではない丸め誤差の発生しない方法で値を格納するのがBigDecimalクラスである。
 
BigDecimalクラスでは、実数値を「整数値」として扱い、この値と「小数点の位置」を別々に管理することで、実数値を丸め誤差なしに格納する。
格納された値は、BigDecimalクラスメソッドで四則演算や比較をうことができる。逆に言うと、BigDecimalクラスからdouble等で値を取り出すと、その時点で丸め誤差が生まれ、値が正確ではなくなってしまう。
これは、BigDecimalクラスに値を格納する段階でも言える。BigDecimalクラスに格納する前にdouble等の変数実数値が格納されていればその時点で丸め誤差が生じるため、BigDecimalクラスを使用する意味がなくなる。
 
BigDecimalクラスは「文字列」の実数値を変換して取り込む事ができるため、たとえばWebアプリケーションの場合、画面から入力された段階ではStringクラスに格納し、それを直接BigDecimalクラスに渡し、演算後、文字列化して画面に返すのがよい。
 
BigDecimalクラス文字列化にはDecimalFormatクラスが向いている。DecimalFormatクラスを使用することで、小数点の桁数やカンマを付けることができる。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
import java.math.BigDecimal;
import java.text.DecimalFormat;

public class Sample
{
    public static void main( String[] args )
    {
        // 出力フォーマットを用意しておきます。
        String format = "0.00000000000000000000";
        DecimalFormat decimalFormat = new DecimalFormat( format );

        // BigDecimalクラスを作成します。
        // 浮動小数点リテラルを使用するとその時点で丸め誤差ができてしまうので、
        // 文字列から作ります。javaコマンドの引数で渡されてきたり、
        // Webの画面から渡されてきたり、プロパティファイルから
        // 渡されてきた場合でも、BigDecimalクラスに渡すまで文字列で持っておきましょう。
        BigDecimal bigDecimal1 = new BigDecimal( "4.1" );
        BigDecimal bigDecimal2 = new BigDecimal( "8.2" );
        // add()メソッドで足します。
        BigDecimal bigDecimalResult = bigDecimal1.add( bigDecimal2 );
        System.out.println( decimalFormat.format( bigDecimalResult ) );
        // 12.30000000000000000000
        // このように、BigDecimalクラスであれば丸め誤差が発生しません。

        // その他、四則演算や比較演算子が備わっています。
        // 引き算( bigDecimal1 - bigDecimal2 )。
        bigDecimalResult = bigDecimal1.subtract( bigDecimal2 );
        System.out.println( decimalFormat.format( bigDecimalResult ) );
        // -4.10000000000000000000

        // 掛け算( bigDecimal1 * bigDecimal2 )。
        bigDecimalResult = bigDecimal1.multiply( bigDecimal2 );
        System.out.println( decimalFormat.format( bigDecimalResult ) );
        // 33.62000000000000000000

        // 割り算( bigDecimal1 / bigDecimal2 )。
        // 四捨五入モードで計算します。
        bigDecimalResult = bigDecimal1.divide( bigDecimal2, BigDecimal.ROUND_HALF_UP );
        System.out.println( decimalFormat.format( bigDecimalResult ) );
        // 0.50000000000000000000

        // 比較
        int compareResult = bigDecimal1.compareTo( bigDecimal2 );
        System.out.println( compareResult );
        // -1
        // bigDecimal1 < bigDecimal2 なのでマイナスになります。

        // このように、BigDecimalクラスに入れたままで、たいがいの事はできます。
        // 逆にdouble型などで取り出すとその時点で丸め誤差が生じてしまうため、
        // できる限りBigDecimalクラスだけで処理するようにしましょう。
    }
}
// Sample.java
import java.math.BigDecimal;
import java.text.DecimalFormat;

public class Sample
{
    public static void main( String[] args )
    {
        // 出力フォーマットを用意しておきます。
        String format = "0.00000000000000000000";
        DecimalFormat decimalFormat = new DecimalFormat( format );

        // BigDecimalクラスを作成します。
        // 浮動小数点リテラルを使用するとその時点で丸め誤差ができてしまうので、
        // 文字列から作ります。javaコマンドの引数で渡されてきたり、
        // Webの画面から渡されてきたり、プロパティファイルから
        // 渡されてきた場合でも、BigDecimalクラスに渡すまで文字列で持っておきましょう。
        BigDecimal bigDecimal1 = new BigDecimal( "4.1" );
        BigDecimal bigDecimal2 = new BigDecimal( "8.2" );
        // add()メソッドで足します。
        BigDecimal bigDecimalResult = bigDecimal1.add( bigDecimal2 );
        System.out.println( decimalFormat.format( bigDecimalResult ) );
        // 12.30000000000000000000
        // このように、BigDecimalクラスであれば丸め誤差が発生しません。

        // その他、四則演算や比較演算子が備わっています。
        // 引き算( bigDecimal1 - bigDecimal2 )。
        bigDecimalResult = bigDecimal1.subtract( bigDecimal2 );
        System.out.println( decimalFormat.format( bigDecimalResult ) );
        // -4.10000000000000000000

        // 掛け算( bigDecimal1 * bigDecimal2 )。
        bigDecimalResult = bigDecimal1.multiply( bigDecimal2 );
        System.out.println( decimalFormat.format( bigDecimalResult ) );
        // 33.62000000000000000000

        // 割り算( bigDecimal1 / bigDecimal2 )。
        // 四捨五入モードで計算します。
        bigDecimalResult = bigDecimal1.divide( bigDecimal2, BigDecimal.ROUND_HALF_UP );
        System.out.println( decimalFormat.format( bigDecimalResult ) );
        // 0.50000000000000000000

        // 比較
        int compareResult = bigDecimal1.compareTo( bigDecimal2 );
        System.out.println( compareResult );
        // -1
        // bigDecimal1 < bigDecimal2 なのでマイナスになります。

        // このように、BigDecimalクラスに入れたままで、たいがいの事はできます。
        // 逆にdouble型などで取り出すとその時点で丸め誤差が生じてしまうため、
        // できる限りBigDecimalクラスだけで処理するようにしましょう。
    }
}

この単語を含むページ

「みだし」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/07/27
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。