2010-11-04 3 views
20
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. Интересно, какой подход правильный. Учитывая приведенный выше код, который следует использовать? Исходный код наверху. Я собираюсь изменить его на второй подход.Java, сравнивая значения BigInteger

ответ

32

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

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

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

if (bigInteger.signum() == 1) { 
// bigger than 0 
} 
+0

спасибо за подсказку, но вы имеете в виду 'больше _than_ 0' право? Просто nitpicking ..: p –

+12

@ Rosdi - уверен, "чем". Somatimas tha 'e' end tha 'a' kay chenga plecas на моем kayboerd ;-) –

26

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

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

} 
+5

True (+1), но проверить '> 0 ', а не' == 1' (см мой ответ) –

+0

@seanizer - просто зафиксировано, что, и +1 к вашему ответу на который. – Bozho

12

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

При проверке значения 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. Этот метод предоставляется в предпочтении индивидуальным методам для каждого из шести булевых операторов сравнения (<, ==,>,> =,! =, < =). Предлагаемая идиома для выполнения этих сравнений: (x.compareTo(y) <op> 0), где <op> является одним из шести операторов сравнения.

+0

Спецификация для 'BigInteger.compareTo()' явно говорит '-1, 0 и 1', но я соглашаюсь использовать' x < 0', 'x == 0',' x> 0' чувствует себя более интуитивно, а не 'x == -1',' x == 0', 'x == 1'. –

+0

@ Rosdi, но он также говорит * Предлагаемая идиома для выполнения этих сравнений: ('x.compareTo (y) 0'), где' 'является одним из шести операторов сравнения. * –

Смежные вопросы