連載
» 2007年02月27日 00時00分 公開

プログラムにおける数の扱い方の常識プログラマーの常識をJavaで身につける(3)(2/3 ページ)

[伊賀敏樹,NTTデータ ビジネスブレインズ]

デシマルで加減乗除してみる [java.math.BigDecimal]

 続いて、先ほど紹介したjava.math.BigDecimalクラスについて、四則演算のための典型的なメソッドを中心に、主要なメソッドを解説していきます。

java.math.BigDecimal#add(加算)

 足し算を行いたい場合には addメソッドを利用します。(3)の個所のように、BigDecimalクラスのインスタンスを2つ利用して加算を実現します。加算した後の値がメソッドの返り値として戻されます。 下記のソースコードを実行してみましょう。

DecimalSample.java
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.math.BigDecimal;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class DecimalSample extends JPanel {

    public DecimalSample() {
        setBackground(Color.white);
    }

    public void paintComponent(final Graphics argGraphics) {
        
        super.paintComponent(argGraphics);
        argGraphics.setFont(new Font("Dialog", Font.PLAIN, 32));
        final BigDecimal value1 = new BigDecimal("152.3");
        final BigDecimal value2 = new BigDecimal("273.42");
        // 加算を実施
        final BigDecimal value3 = value1.add(value2); // (3)
        argGraphics.drawString(value1.toString() + "+"
            + value2.toString() + "=" + value3.toString()
             , 10, 32);
    }

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("デシマル利用サンプル");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(new DecimalSample());
        frame.setLocationRelativeTo(null);
        frame.setSize(400, 400);
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

図3 デシマル利用サンプル(加算) 図3 デシマル利用サンプル(加算)

java.math.BigDecimal#subtract(減算)

 引き算を行いたい場合には、subtractメソッドを利用します。上記DecimalSample.javaのpaintCompenentを下記に書き換えて実行してみましょう。

    public void paintComponent(final Graphics argGraphics) {
        super.paintComponent(argGraphics);
        argGraphics.setFont(new Font("Dialog", Font.PLAIN, 32));
        final BigDecimal value1 = new BigDecimal("152.3");
        final BigDecimal value2 = new BigDecimal("273.42");
        // 減算を実施
        final BigDecimal value3 = value1.subtract(value2); //(4)
        argGraphics.drawString(value1.toString() + "−"
            + value2.toString() + "=" + value3.toString()
            , 10, 32);
    }

図4 デシマル利用サンプル(減算) 図4 デシマル利用サンプル(減算)

 (4)の個所のように、BigDecimalクラスのインスタンスを2つ利用して減算を実現します。減算した後の値がメソッドの返り値として戻されます。

java.math.BigDecimal#multiply(乗算)

 掛け算を行いたい場合には、multiplyメソッドを利用します。上記DecimalSample.javaのpaintCompenentを下記に書き換えて実行してみましょう。

    public void paintComponent(final Graphics argGraphics) {
        super.paintComponent(argGraphics);
        argGraphics.setFont(new Font("Dialog", Font.PLAIN, 30));
        final BigDecimal value1 = new BigDecimal("152.3");
        final BigDecimal value2 = new BigDecimal("273.42");
        // 乗算を実施
        final BigDecimal value3 = value1.multiply(value2); //(5)
        argGraphics.drawString(value1.toString() + "×"
           + value2.toString() + "=" + value3.toString()
           , 10, 32);
    }

図5 デシマル利用サンプル(乗算) 図5 デシマル利用サンプル(乗算)

 (5)の個所のように、BigDecimalクラスのインスタンスを2つ利用して乗算を実現します。乗算した後の値がメソッドの返り値として戻されます。

java.math.BigDecimal#divide(除算)

 割り算を行いたい場合には、divideメソッドを利用します。divideメソッドには、いくつかの注意すべきポイントがあります。

  • 私たちの多くが小学校で習ったような割り算を実行するために、丸めモードとして、java.math.BigDecimal.ROUND_HALF_UPを指定するようにします。
  • スケールを指定するメソッドと、スケールを指定しないメソッドとの2種類がある点に注意が必要です。

●スケールを指定しない例

 上記DecimalSample.javaのpaintCompenentを下記に書き換えて実行してみましょう。

    public void paintComponent(final Graphics argGraphics) {
        super.paintComponent(argGraphics);
        argGraphics.setFont(new Font("Dialog", Font.PLAIN, 30));
        final BigDecimal value1 = new BigDecimal("152.3");
        final BigDecimal value2 = new BigDecimal("273.42");
        // 除算を実施

        final BigDecimal value3 = value1.divide(value2,
            BigDecimal.ROUND_HALF_UP);
        argGraphics.drawString(value1.toString() + "÷"
           + value2.toString() + "=" + value3.toString()
           , 10, 32);
    }

 スケールを指定しない場合には、割られる数のスケールを計算結果のスケールに適用します(この例では、小数点以下第1位まで)。

図6 デシマル利用サンプル(除算1けた) 図6 デシマル利用サンプル(除算1けた)

●スケールを指定する例

 上記DecimalSample.javaのpaintCompenentを下記に書き換えて実行してみましょう。

    public void paintComponent(final Graphics argGraphics) {
        super.paintComponent(argGraphics);
        argGraphics.setFont(new Font("Dialog", Font.PLAIN, 30));
        final BigDecimal value1 = new BigDecimal("152.3");
        final BigDecimal value2 = new BigDecimal("273.42");
        // 除算を実施
        final BigDecimal value3 = value1.divide(value2, 7,
            BigDecimal.ROUND_HALF_UP);
        argGraphics.drawString(value1.toString() + "÷"
            + value2.toString() + "=" + value3.toString()
            , 10, 32);
    }

図7 デシマル利用サンプル(除算7けた) 図7 デシマル利用サンプル(除算7けた)

 小数点以下第7位まで求めるよう、スケールを指定します。割られる数のスケールに関係なく、指定したスケール(この例では、7けたまで)を計算結果として取得できます。

デシマル型の比較

 デシマル型を使っていてよく間違いに陥りやすいのが、デシマル型の値の比較についてです。java.math.BigDecimalクラスには、値の比較を行うためのメソッドとして、compareToメソッドとequalsメソッドの2つがあります。

● java.math.BigDecimal#compareToメソッド

 与えられた2つのBigDecimalオブジェクトの大小比較を行います。注意すべき点は、このメソッドで一致するかどうかを比較した際の判定結果についてです。compareToでは、2つのBigDecimalオブジェクトの値が一致するかをスケールを無視して比較します。例えば、2.0と2.00は等しいものと判断します。この点を特に注意する必要があります。

 それ以外の点については、通常のcompareToメソッドと同様なものとして考えて差し支えないです。

● java.math.BigDecimal#equalsメソッド

 与えられた2つのBigDecimalオブジェクトの値が一致するかどうかを比較します。注意すべき点は、このメソッドでは、compareToとは異なり、2つのBigDecimalオブジェクトが値もスケールも同じである場合にだけ等しいと見なすという点です。例えば、このメソッドでは、2.0と2.00は等しくないものと判断します。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。