2012-03-02 4 views
-1

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

+4

Определите «ровность», если это не целое число. – Mysticial

+0

Даже означает, что он заканчивается 0, 2, 4, 6 или 8. – jersam515

+2

Итак, '13.110' даже и' 13.11' нет? Вы можете уточнить? – Mysticial

ответ

2

Умножить на 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; 
} 
1

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

+0

Это только просмотр целочисленной части числа, в вопросе комментариев, что кажется, что требуется решение, которое также смотрит на дробную часть. –

+0

@ increment1: из комментариев, которые были там, когда я ответил на вопрос, я понял, что OP хочет отбросить дробную часть. Теперь это выглядит иначе. Трудно ответить на плохо сформированный вопрос, и большую часть времени я даже не пытаюсь. На этот раз я сожалею об этом. –

+0

Полностью понятно, так как я еще не уверен, что вопрос ясен кому-либо.Я прокомментировал это только потому, что это был принятый ответ, если читатели не знали, что преобразование большого десятичного числа в большое целое будет отбрасывать дробную часть (хотя это, вероятно, очевидно). –

3

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

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

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 если теряется информация.

3

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

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

Этот метод позволяет избежать потери точности или каких-либо переполнение как это может произойти при преобразовании BigDecimal в int, lon г или двойной.

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