BigDecimalで>、=、<などの比較演算子を使用する方法


103

unitPriceがBigDecimalデータ型として設定されたドメインクラスがあります。現在、価格を比較するメソッドを作成しようとしていますが、BigDecimalデータ型に比較演算子を含めることができないようです。データ型を変更する必要がありますか、それとも他の方法がありますか?


以降はBigDecimalあるObject、ないこのdoesn't作品。しかし、単純に互いに1を引いて、結果の値が<0である==0かどうかを確認することもできます>0。それ以外の場合は、BigDecimal
SomeJavaGuy

2
そのためcompareTo、-1、0、または1を返すメソッドがあります。これは基本的にComparableです。
M. Deinum 16年

回答:


113

クラスのすべてのオブジェクトには、別のBigDecimalと比較するために使用できるBigDecimalメソッドがありcompareToます。結果はcompareTo、その後比較され> 0== 0または< 0何が必要に応じて。ドキュメントを読んでください。

事業者は==<>などだけのようなプリミティブデータ型に使用することができintlongdoubleそのラッパのようなクラスやIntegerDouble

のドキュメントからcompareTo

これBigDecimalを指定されBigDecimalたと比較します。

BigDecimal 値は等しいがスケールが異なる2つのオブジェクト(2.0と2.00など)は、このメソッドによって等しいと見なされます。このメソッドは、6つのブール比較演算子(<、==、>、> =、!=、<=)の個々のメソッドに優先して提供されます。これらの比較を実行するための提案イディオムである:(x.compareTo(y) <op> 0)ここで、<op> 6つの比較演算子の一つです。

戻り値:このBigDecimalは、数値的にvalより小さい、等しい、または大きいため、-1、0、または1。


1
しかし、compareToメソッドは、価格がより大きいか、等しいか、低いかなどを見つけるのに役立ちますか?
user3127109

2
はい。その情報は、回答で提供されるリンクにあります。
Drew Kennedy

4
@ user3127109はい、のa.compareTo(b)場合はゼロよりも大きい数値を返しa > b、の0場合a == bはゼロ未満の数値を返しますa < b
ゾルタン

119

要するに:

firstBigDecimal.compareTo(secondBigDecimal) < 0 // "<"
firstBigDecimal.compareTo(secondBigDecimal) > 0 // ">"    
firstBigDecimal.compareTo(secondBigDecimal) == 0 // "=="  
firstBigDecimal.compareTo(secondBigDecimal) >= 0 // ">="    

22

compareToBigDecimal のメソッドを使用します。

public int compareTo(BigDecimal val)このBigDecimalを指定されたBigDecimalと比較します。

Returns:
-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.

12

あなたは、名前のメソッドを使用することができcompareTox.compareTo(y)。xとyが等しい場合は0を返し、xがyより大きい場合は1を返し、xがyより小さい場合は-1を返します。


11

6つのブール比較演算子(<、==、>、> =、!=、<=)の例を次に示します。

BigDecimal big10 = new BigDecimal(10);
BigDecimal big20 = new BigDecimal(20);

System.out.println(big10.compareTo(big20) < -1);  // false
System.out.println(big10.compareTo(big20) <= -1); // true
System.out.println(big10.compareTo(big20) == -1); // true
System.out.println(big10.compareTo(big20) >= -1); // true
System.out.println(big10.compareTo(big20) > -1);  // false
System.out.println(big10.compareTo(big20) != -1); // false

System.out.println(big10.compareTo(big20) < 0);   // true
System.out.println(big10.compareTo(big20) <= 0);  // true
System.out.println(big10.compareTo(big20) == 0);  // false
System.out.println(big10.compareTo(big20) >= 0);  // false
System.out.println(big10.compareTo(big20) > 0);   // false
System.out.println(big10.compareTo(big20) != 0);  // true

System.out.println(big10.compareTo(big20) < 1);   // true
System.out.println(big10.compareTo(big20) <= 1);  // true
System.out.println(big10.compareTo(big20) == 1);  // false
System.out.println(big10.compareTo(big20) >= 1);  // false
System.out.println(big10.compareTo(big20) > 1);   // false
System.out.println(big10.compareTo(big20) != 1);  // true

5

BigDecimalあなたが使用することはできませんので、原始的ではない<>演算子を。ただし、なのでComparable、を使用compareTo(BigDecimal)して同じ効果を得ることができます。例えば:

public class Domain {
    private BigDecimal unitPrice;

    public boolean isCheaperThan(BigDecimal other) {
        return unitPirce.compareTo(other.unitPrice) < 0;
    }

    // etc...
}

0

IBMのcom.ibm.etools.marshall.util.BigDecimalRange utilクラスを使用すると、BigDecimalが範囲内にあるかどうかを比較できます。

boolean isCalculatedSumInRange = BigDecimalRange.isInRange(low, high, calculatedSum);

0

このスレッドには、BigDecimal.compareTo(BigDecimal)メソッドがBigDecimalインスタンスを比較するために使用するメソッドであることを示す多くの回答があります。BigDecimal.compareTo(BigDecimal)メソッドを使用した経験がなくなったため、BigDecimalインスタンスの作成方法に注意するために追加したかっただけです。したがって、たとえば...

  • new BigDecimal(0.8)正確BigDecimalではない値を持つインスタンスを作成します0.8、50 +のスケールを持つ。
  • new BigDecimal("0.8")作成されるBigDecimal値でインスタンスであり、正確に0.81のスケールを有します

...そして2つはBigDecimal.compareTo(BigDecimal)に従って不等であると見なされますスケールが小数点以下の桁数に制限されていない場合、値は等しくないためメソッドに。

まずBigDecimalBigDecimal(String val)コンストラクターBigDecimal.valueOf(double val)ではなくコンストラクターまたはメソッドを使用してインスタンスを作成するように注意してくださいBigDecimal(double val)。次に、BigDecimal.setScale(int newScale、RoundingMode roundingMode)メソッドを使用して、比較する前にBigDecimalインスタンスのスケールを制限できることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.