Преобразование данных Java BigDecimal в противоположный знак долго

Согласно документации по Java 7 метод longValue из класса java.math.BigDecimal может возвращать результат с обратным знаком.

Преобразует этот BigDecimal в длинный. Это преобразование аналогично сужающему примитивному преобразованию из двойного в короткое, как определено в разделе 5.1.3 Спецификации языка Java™: любая дробная часть этого BigDecimal будет отброшена, и если результирующее «BigInteger» слишком велико, чтобы поместиться в a long возвращаются только младшие 64 бита. Обратите внимание, что это преобразование может привести к потере информации об общей величине и точности этого значения BigDecimal, а также к возвращению результата с противоположным знаком.

В каком случае это возможно?


person dinhokz    schedule 12.09.2016    source источник
comment
Это может произойти, если результирующий BigInteger слишком велик, чтобы поместиться в long, а старший бит последних 64 бит равен 1.   -  person resueman    schedule 12.09.2016
comment
Допустим, целочисленная часть BigDecimal будет представлена ​​75 битами. Он слишком большой, чтобы поместиться в long. Как сказано в документации, в этом случае в long помещаются только младшие 64 бита. Если старший из этих 64 битов равен 1, число будет отрицательным.   -  person jonhopkins    schedule 12.09.2016


Ответы (2)


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

Пример:

BigDecimal num = new BigDecimal(Long.MAX_VALUE);
System.out.println(num);                  // prints: 9223372036854775807
System.out.println(num.longValue());      // prints: 9223372036854775807

num = num.add(BigDecimal.TEN);            // num is now too large for long
System.out.println(num);                  // prints: 9223372036854775817
System.out.println(num.longValue());      // prints: -9223372036854775799
System.out.println(num.longValueExact()); // throws: ArithmeticException: Overflow
person Andreas    schedule 12.09.2016

Я произойдет, если значение больше, чем максимальное значение long

BigDecimal dec = new BigDecimal(Long.MAX_VALUE +1);
System.out.println(dec.longValue());
person blue    schedule 12.09.2016
comment
Long.MAX_VALUE + 1 равно -9223372036854775808, поэтому BigDecimal будет иметь значение -9223372036854775808, а longValue() вернет точное значение без переполнения. - person Andreas; 12.09.2016