检查BigDecimal值是否在范围内

时间:2014-11-18 14:24:16

标签: java bigdecimal

我有BiGDecimal price,我需要检查它是否在某个范围内。 例如,应该是3个条件:

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

如何使用BigDecimal类型正确执行。

10 个答案:

答案 0 :(得分:14)

使用.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) op 0),其中 op < / strong>是六个比较运算符之一 [(&lt;,==,&gt;,&gt; =,!=,&lt; =)]

干杯,

答案 1 :(得分:7)

我认为没有解决方法。最终你可以将它包装成一个漂亮的设计模式,但是BigDecimal只有一种比较方法。

我的想法是提取范围的方法:

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

答案 2 :(得分:7)

让我们通用:

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

答案 3 :(得分:1)

使用BigDecimal.compareTo(val)来比较您的号码是更大,更小还是相等。

  

返回-1,0或1,因为此BigDecimal在数值上小于,等于或大于val。

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) {
   ....
}

答案 4 :(得分:1)

使用compareTo方法

  

java.math.BigDecimal.compareTo(BigDecimal val)

如果BigDecimal小于val,则此方法返回-1;如果BigDecimal大于val,则此方法返回1;如果BigDecimal等于val,则此方法返回0

答案 5 :(得分:1)

你可以这样做;

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

答案 6 :(得分:1)

如果您已经在使用Apache commons lang,则一种选择是使用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));
}

答案 7 :(得分:1)

BigDecimal value = BigDecimal.valueOf(2);
BigDecimal zero = BigDecimal.valueOf(0);
BigDecimal one = BigDecimal.valueOf(1);
// When it is greater than 0 it returns 1 or if it is equal to 0 it returns 0
System.out.println(value.compareTo(BigDecimal.ZERO)>=0);
// When it is greater than 1 it returns -1 or if it is equal to 1 it returns 0
System.out.println(value.compareTo(BigDecimal.ONE)<=0);
boolean condition =  value.compareTo(BigDecimal.ZERO) >= 0 && value.compareTo(BigDecimal.ONE) <= 0;
System.out.println(condition);

答案 8 :(得分:0)

使用BigDecimal类中的signum方法:

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

答案 9 :(得分:0)

正如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小于min或大于max;
  • 1,如果x等于min或max;
  • 2,如果x属于间隔,但它不等于min或max。

因此,如果总和大于0(或者根本不等于0),则x变量将属于该区间。