【Java】BigDecimalの値をcompareTo()で比較する!
BigDecimalの値の比較を行う場合にはcompareTo()メソッドを使用します。
BigDecimalクラスは誤差が出ないように正確な値を求めたい場に使用するクラスである為、compareTo()メソッドと組み合わせて使うことでより正確に値の比較を行うことができます。
compareTo()メソッドの他に比較するメソッドとしてequals()メソッドもありますが、場合によっては返す値が異なりますので使い方には注意が必要です。
今回は以下の場合でBigDecimalの値を比較してきます。
・ compareTo()でBigDecimalの値を比較する場合
・ equal()とcompareTo()でBigDecimalの値を比較した時の違い
目次
BigDecimalクラスとは
BigDecimalクラスとは、誤差が出ないように正確な値を求めたい場合に使用するクラスとなります。
BigDecimalクラスを使用する場合はBigDecimalを下記のようにインポートする必要があります。
1 |
import java.math.BigDecimal; |
compareTo()メソッドとは
BigDecimalクラスのcompareTo()メソッドは数値を比較するメソッドとなります。
compareTo()メソッドの書き方
compareTo()メソッドの構文は下記となります。
1 |
date値1.compareTo(date値2) |
()の引数にdate値2を指定することで、date値1とdateの値2を比較するようになります。
比較した場合、一致する場合は「0」を、異なる場合は「0以外」を返します。
値の比較を行うサンプルコード
compareTo()メソッドを使って、値の比較を行うサンプルコードを紹介します。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// 配列の要素を順番に取得する import java.math.BigDecimal; public class Main { public static void main(String[] args) throws Exception { BigDecimal bd1 = new BigDecimal("10"); BigDecimal bd2 = new BigDecimal("20"); // compareToメソッドでのbd1とbd2との比較 System.out.println(bd1 + "と" + bd2 + "の比較:"); if (bd1.compareTo(bd2) > 0) { System.out.println(bd1 + "の方が大きい"); } else if (bd1.compareTo(bd2) < 0) { System.out.println(bd2 + "の方が大きい"); } else { System.out.println("等しい"); } } } |
出力結果
10と20の比較:
20の方が大きい
BigDecimalクラスのcompareTo()メソッドによって比較した結果を返しています。
equals()とcompareTo()との違い
equals()で比較した場合とcompareTo()で比較した場合とでは返す結果が異なることがあります。
そのサンプルコードを見てみます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// BigDecimalで値の比較を行う import java.math.BigDecimal; public class Main { public static void main(String[] args) throws Exception { BigDecimal bd1 = new BigDecimal("10"); BigDecimal bd2 = new BigDecimal("10.0"); // equalsメソッドとcompareToメソッドとの違い System.out.println( bd1 + "と" + bd2 + "とのequalsメソッドでの比較:"); System.out.println(bd1.equals(bd2) ? bd1 + "と" + bd2 + "は等しい" : bd1 + "と" + bd2 + "は等しくない"); System.out.println( bd1 + "と" + bd2 + "とのcompareToメソッドでの比較:"); System.out.println(bd1.compareTo(bd2) == 0 ? bd1 + "と" + bd2 + "は等しい" : bd1 + "と" + bd2 + "は等しくない"); } } |
出力結果
10と10.0とのequalsメソッドでの比較:
10と10.0は等しくない
10と10.0とのcompareToメソッドでの比較:
10と10.0は等しい
bd1とbd2はどちらも値が10である為、compareTo()メソッドの場合では等しいと判断しています。
しかし、equals()メソッドでは等しくないと判断しています。
equals()メソッドは単純に文字列の比較を行う為、「10」と「10.0」は別の値であると判定し、falseを返しています。
しかし、ompareTo()メソッドはBigDecimalクラスによって「10」と「10.0」は同じ値であると判断し、「0」を返しています。
今回のポイント
BigDecimalで値を比較するにはcompareTo()
BigDecimalで値の比較を行うには、BigDecimalクラスのcompareTo()メソッドを使用する
「BigDecimal」インスタンス同士での値の比較には、BigDecimalクラスのcompareTo()メソッドを使います。
このメソッドはパラメータの「BigDecimal」インスタンスと値を比較して、 パラメータの「BigDecimal」インスタンスの値の方が小さければ「1」を、大きければ「-1」 を、等しければ「0」を戻します。
サンプルコードでは、「bd1」と「bd2」はどちらも「10」という値ですが、compareTo()メソッドでは値が等しいと判定され、equals()メソッドでは値が異なると判定されています。
これは、equals()メソッドは2つの「BigDecimal」インスタンスの値だけでなく、スケール(小数点以下の桁数)も等しいかどうかも判定しているからです。
「BigDecimal」インスタンス同士が等しいかどうかを判定する場合、値だけを見ることがほとんどなので、そのような場合はcompareTo()メソッドを使うようにしてください。
関連記事
小数点以下の計算を正確に行うBigDecimalクラスについてはこちらをご参考ください。
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。