BigDecimal - 检查值在双倍范围内

时间:2011-03-23 21:07:28

标签: java double bigdecimal

我有一个Java应用程序,它从某个地方解析一个数字,并检查它是一个有效的int(在Integer.MIN_VALUE和Integer.MAX_VALUE之间)还是一个有效的double(在Double.MIN_VALUE和Double.MAX_VALUE之间)。

我正在使用此代码:

import java.math.BigDecimal;
import java.math.BigInteger;

  public class Test  {

    public static final BigDecimal DOUBLE_MAX = BigDecimal.valueOf(Double.MAX_VALUE);
    public static final BigDecimal DOUBLE_MIN = BigDecimal.valueOf(Double.MIN_VALUE);

    public static final BigInteger INTEGER_MIN = BigInteger.valueOf(Integer.MIN_VALUE);
    public static final BigInteger INTEGER_MAX = BigInteger.valueOf(Integer.MAX_VALUE);

    private static boolean inRange(BigDecimal value) {
        return DOUBLE_MAX.compareTo(value) >= 0 &&
          DOUBLE_MIN.compareTo(value) <= 0;
    }

    private static boolean inRange(BigInteger value) {
        return INTEGER_MAX.compareTo(value) >= 0 &&
          INTEGER_MIN.compareTo(value) <= 0;
    }

    public static void main(String[] args)
    {
        System.out.println(inRange(new BigInteger("1234656")));
        System.out.println(inRange(new BigInteger("0")));
        System.out.println(inRange(new BigInteger("-987")));

        System.out.println(inRange(new BigDecimal("1234656.0")));
        System.out.println(inRange(new BigDecimal("0.0")));
        System.out.println(inRange(new BigDecimal("-987.0")));
    }
  }

哪个适用于int值,但由于某种原因,任何零或负双值都会失败。所以运行上面的命令会产生输出:

true
true
true
true
false
false

我在这里做错了什么?

另外,我已经看到DOUBLE_MIN设置为-Double.MAX_VALUE的示例。这有效,但它是否正确?

感谢。

2 个答案:

答案 0 :(得分:6)

Double.MIN_VALUE表示最小值。 (也就是说,正值接近于零。)

来自the documentation

  

一个常量,保持double类型的最小正非零值,2 -1074

这就是

的原因
System.out.println(inRange(new BigDecimal("0.0")));
System.out.println(inRange(new BigDecimal("-987.0")));

输出错误。所提供的值都不是(严格地)大于0.


解决方案

由于double s的范围是围绕origo对称的(而不是整数,它在负面向前延伸一步),你可以通过写-Double.MAX_VALUE得到最小(负)值。那是

BigDecimal DOUBLE_MIN = BigDecimal.valueOf(-Double.MAX_VALUE);

答案 1 :(得分:1)

如果您看到Double.MIN_VALUE的javadoc,则说

 A constant holding the smallest **positive nonzero** value of type
 <code>double</code>