web-dev-qa-db-ja.com

BigDecimal値が範囲内にあるかどうかを確認します

私が持っています BiGDecimal priceそして私はそれが何らかの範囲内にあるかどうかを確認する必要があります。たとえば、次の3つの条件が必要です。

if (price >= 0 and price <=500) {
   ....
} else if (price >=500 && price <=1000) {
   ....
} else if (price > 1000) {
   ....
}

BigDecimalタイプを使用してそれを正しく行う方法。

11
user3127896

これは、 。compareTo() メソッドを使用して実現できます。例えば:

if ( price.compareTo( BigDecimal.valueOf( 500 ) > 0 
     && price.compareTo( BigDecimal.valueOf( 1000 ) < 0 ) {
    // price is larger than 500 and less than 1000
    ...
}

JavaDocからの引用(および言い換え):

これらの比較を実行するための推奨イディオムは次のとおりです。(x.compareTo(y)op0)、ここで、opは、6つの比較演算子[(<、 ==、>、> =、!=、<=)]

乾杯、

15

それを一般的にしましょう:

public static <T extends Comparable<T>> boolean isBetween(T value, T start, T end) {
    return value.compareTo(start) >= 0 && value.compareTo(end) <= 0;
}
8
Kirill Karandin

これに対する回避策はないと思います。最終的にはそれをNiceデザインパターンにラップすることができますが、BigDecimalには比較する方法が1つしかありません。

私の考えは、範囲のメソッドを抽出することです。

boolean isBetween(BigDecimal price, BigDecimal start, BigDecimal end){
  return price.compareTo(start) > 0 && price.compareTo(end) < 0;
}
7
Beri

すでにApachecommons langを使用している場合、1つのオプションは、独自のユーティリティメソッドを作成する代わりに、 Range クラスを使用することです。

@Test
public void bigDecimalInRange() {
  Range<BigDecimal> myRange = Range.between(BigDecimal.TEN, BigDecimal.valueOf(300));
  BigDecimal tooSmallAmount = new BigDecimal("2.50");
  assertFalse(myRange.contains(tooSmallAmount));

  BigDecimal rightAmount = new BigDecimal("10.01");
  assertTrue(myRange.contains(rightAmount));
}
2
beat

BigDecimal.compareTo(val) を使用して、数値が大きいか小さいか、等しいかを比較します。

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

if (price.compareTo(BigDecimal.ZERO) >= 0 && 
    price.compareTo(new BigDecimal(500)) <= 0) {
   ....
}  else if (price.compareTo(new BigDecimal(500)) >= 0 && 
            price.compareTo(new BigDecimal(1000)) <= 0) {
   ....
} else if (price.compareTo(price.compareTo(new BigDecimal(1000)) < 0) {
   ....
}
1
Simulant

compareToメソッドを使用する

Java.math.BigDecimal.compareTo(BigDecimal val)

このメソッドは、BigDecimalがvalより小さい場合は-1を返し、BigDecimalがvalより大きい場合は1を返し、BigDecimalがvalに等しい場合は0を返します。

1
Prabhu R.D

このようにsthgを実行できます。

public class BigDecimalDemo {

  public static void main(String[] args) {

    // create 2 BigDecimal objects
    BigDecimal bg1, bg2;

    bg1 = new BigDecimal("10");
    bg2 = new BigDecimal("20");

    //create int object
    int res;

    res = bg1.compareTo(bg2); // compare bg1 with bg2

    String str1 = "Both values are equal ";
    String str2 = "First Value is greater ";
    String str3 = "Second value is greater";

    if( res == 0 )
      System.out.println( str1 );
   else if( res == 1 )
      System.out.println( str2 );
   else if( res == -1 )
     System.out.println( str3 );
 }
}

リソース: http://www.tutorialspoint.com/Java/math/bigdecimal_compareto.htm

1
Semih Eker

Kirill Karandinが言ったように、一般的なメソッドを書くことができます。

public static <T extends Comparable<T>> boolean isBetween(T x, T lowerBound, T upperBound) {
    return (x.compareTo(lowerBound) + upperBound.compareTo(x)) > 0;
}

違いは、内部合計が返されることです。

  • 0、xが最小よりも小さいか最大よりも大きい場合。
  • 1、xが最小または最大のいずれかに等しい場合。
  • 2、xが区間に属しているが、最小または最大のいずれにも等しくない場合。

したがって、合計が0より大きい(または単に0に等しくない)場合、x変数は区間に属します。

0

BigDecimalクラスのsignumメソッドを使用します。

private static boolean isBetween(BigDecimal amount, BigDecimal init, BigDecimal end) {
    return amount.subtract(init).signum() >= 0 && amount.subtract(end).signum() <= 0;
}
0
dani77