BigDecimal - проверка значения в двойном диапазоне - PullRequest
2 голосов
/ 24 марта 2011

У меня есть 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 ]

6 голосов
/ 24 марта 2011

Double.MIN_VALUE представляет минимальное положительное значение. (То есть положительное значение близко к нулю.)

С документация :

Константа, содержащая наименьшее положительное ненулевое значение типа double, 2 -1074 .

Это причина, по которой

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

выводит false. Ни одно из представленных значений (строго) не превышает 0.


Решение

Так как диапазон double s симметричен относительно исходного значения (в отличие от целых чисел, которые растягиваются на один шаг на отрицательной стороне), вы можете получить минимальное (отрицательное) значение, написав -Double.MAX_VALUE. Это

BigDecimal DOUBLE_MIN = BigDecimal.valueOf(-Double.MAX_VALUE);
1 голос
/ 24 марта 2011

Если вы видите Javadoc для Double.MIN_VALUE, он говорит:

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