Java, сравнивая значения BigInteger - PullRequest
20 голосов
/ 04 ноября 2010
BigInteger bigInteger = ...;


if(bigInteger.longValue() > 0) {  //original code
    //bigger than 0
}

//should I change to this?
if(bigInteger.compareTo(BigInteger.valueOf(0)) == 1) {
    //bigger than 0
}

Мне нужно сравнить некоторые произвольные значения BigInteger.Интересно, какой подход правильный.Учитывая приведенный выше код, какой из них следует использовать?Исходный код находится сверху. Я думаю изменить его на второй подход.

Ответы [ 3 ]

34 голосов
/ 04 ноября 2010

Первый подход неверен, если вы хотите проверить, имеет ли BigInteger положительное значение: longValue просто возвращает младший 64-битный бит , который может обратить знак ... потерпеть неудачу для положительного BigInteger.

Второй подход лучше (см. Божий ответ для оптимизации).

Другая альтернатива: BigInteger#signum возвращает 1, если значение положительное:

if (bigInteger.signum() == 1) {
 // bigger than 0
}
25 голосов
/ 04 ноября 2010

Если вы используете BigInteger, это предполагает, что вам нужно больше чисел, чем может обработать long.Так что не используйте longValue().Используйте compareTo.С твоим примером это будет лучше:

if (bigInteger.compareTo(BigInteger.ZERO) > 0) {

}
13 голосов
/ 04 ноября 2010

Это не прямой ответ, а важное примечание об использовании compareTo ().

При проверке значения compareTo () всегда проверяйте для x < 0, x > 0 и x == 0.
Не проверять на x == 1

Из Comparable.compareTo () Javadocs:

Сравнивает этот объект с указанным объектом для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше, равен или больше указанного объекта.

Примечание:

  • A negative integer, а не -1.
  • A positive integer, а не 1.

Правда, проверка для ==1 и ==-1 будет работать для BigInteger. Это BigInteger.compareTo() код:

public int compareTo(BigInteger val) {
    if (signum == val.signum) {
        switch (signum) {
        case 1:
            return compareMagnitude(val);
        case -1:
            return val.compareMagnitude(this);
        default:
            return 0;
        }
    }
    return signum > val.signum ? 1 : -1;
}

Но это все еще плохая практика, и она явно рекомендуется в JavaDocs :

Сравнивает этот BigInteger с указанным BigInteger. Этот метод предоставляется в предпочтении отдельным методам для каждого из шести логических операторов сравнения (<, ==,>,> =,! =, <=). <strong>Предлагаемая идиома для выполнения этих сравнений: (* ​​1046 *), где <op> - один из шести операторов сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...