Как я могу проверить, является ли BigDecimal четным? - PullRequest
0 голосов
/ 02 марта 2012

Я пытался реализовать это некоторое время, и я не могу сделать это правильноЛюбая помощь будет принята с благодарностью?

Ответы [ 4 ]

5 голосов
/ 02 марта 2012

Термин «четный» обычно не применяется к десятичным числам, но если вы просто хотите проверить, содержит ли последняя цифра десятичного представления дробного числа 2,4,6 или 8, то вы можете сделать следующее :

BigDecimal decimal = new BigDecimal("123.456");
BigInteger integer = decimal.stripTrailingZeros().unscaledValue();
boolean isEven = !integer.testBit(0);    

Этот метод позволяет избежать потери точности или переполнения, что может произойти при преобразовании BigDecimal в int, long или double.

2 голосов
/ 02 марта 2012

Только целые числа могут быть четными.См .: http://en.wikipedia.org/wiki/Parity_(mathematics) BigDecimal обрабатывает десятичные числа, которые не являются четными числами http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html

Если необходимо, вы можете преобразовать большое десятичное число в ближайшее возможное целое число:

BigDecimal bd;
bd = 123.456;
int i;
// Convert the BigDecimal to an Integer
i = bd.intValue();

Или, если вы хотите получать уведомления, если информация теряется (часть после десятичного знака), попробуйте

try {
  i = intValueExact();
} catch (Exception e) {
  System.out.println( "Not a whole number: " + e.getMessage());
}

, который выдаст ArithmeticException, если информация потеряна.

2 голосов
/ 02 марта 2012

boolean isEven = ! decimalValue.toBigInteger().testBit(0)

1 голос
/ 02 марта 2012

Умножьте на 10, пока не достигнете желаемой точности (количество цифр после.), Затем используйте побитовое сравнение

public Boolean isEven ( BigDecimal decimal, int precision ) {
    double d = decimal.doubleValue ();
    int i = 0;
    while ( ++i <= precision )
        d *= 10;
    return ( (int) d & 1 ) == 0;
}
...