株式会社イーブ|未経験・転職の方も就職可能。Javaプログラマー育成のエキスパート

HOMEJAVA技術者育成システム開発求人情報個人情報保護

第 15 回 ~ 天文学的な数値計算 ~

トップページ > Java技術者育成 > Javaワンポイント > 第 15 回 ~ 天文学的な数値計算 ~
今回は大きな数値を扱う方法について書いてみたいと思います。
Javaの基本型でサポートしている数値型は全6種類あります。
その中で整数型なら「long型」、小数なら「double型」が最も大きい数値を表すことができます。
では、この型の限界を超えてしまった場合、どうやって計算するのでしょうか?

実はJavaには大きい桁数の数値を扱うクラスが用意されています。
整数なら「java.math.BigInteger」、小数なら「java.math.BigDecimal」です。

特に小数に関してはJavaの基本型は不動小数点数のサポートしかされていないため、丸め誤差などの問題が発生します。
しかし、BigDecimalは丸め操作を制御できるので思いのまま計算が可能です。

今回のサンプルでは、先ずlong型で1に2を100回掛けるという計算をしています。
しかし、long型の最大値を超えてしまい、結果は0になります。(エラーにはなりません。)
その後、同じ計算をBigIntegerで行っています。
また、小数の計算として1を2で100回割るという計算もしています。

public class BigNum {

    public static void main(String[] args) {

        // 1に100回、2を掛けた値(オーバーフローして0になる)
        long l = 1;
        for (int i = 0; i < 100; i++) {
            l *= 2;
        }
        System.out.println(l);

        // 1に100回、2を掛けた値
        BigInteger bi = BigInteger.valueOf(1);
        for (int i = 0; i < 100; i++) {
            bi = bi.multiply(BigInteger.valueOf(2));
        }
        System.out.println(bi);

        // 1を100回、2で割った値
        BigDecimal bd = BigDecimal.valueOf(1);
        for (int i = 0; i < 100; i++) {
            bd = bd.divide(BigDecimal.valueOf(2));
        }
        System.out.println(bd);

    }

}


オイラの財布の中身を計算するときは特殊なクラスは要りません......。

[Javaワンポイント]内の前後の記事
第 16 回 ~ ホームページを読み込む ~
→ 第 15 回 ~ 天文学的な数値計算 ~
第 14 回 ~ プロパティキャッシュ ~


■更新日時での前後の記事
8月29日 お天気
→ 第 15 回 ~ 天文学的な数値計算 ~
8月28日 お天気