Согласно Java 7 documentation, метод longValue из класса java.math.BigDecimal может возвращать результат с обратным знаком.данных Java BigDecimal конвертирование в противоположный знак долго
Преобразует этот BigDecimal в длинный. Это преобразование аналогично сужению примитивного преобразования от двойного до короткого, как определено в разделе 5.1.3 Спецификации языка Java ™: любая дробная часть этого BigDecimal будет отброшена, и если получившийся «BigInteger» слишком велик, чтобы вписаться в длинный, возвращаются только 64 разряда младшего порядка. Обратите внимание, что это преобразование может потерять информацию об общей величине и точности этого значения BigDecimal, а также вернуть результат с противоположным знаком.
В каком случае это возможно?
Это может случиться «, если в результате„BigInteger“слишком большой, чтобы поместиться в long ", а верхний бит из последних 64 бит равен' 1'. – resueman
Скажем, целая часть 'BigDecimal' будет представлять 75 бит для представления. Это слишком велико, чтобы вписаться в «длинный». Как говорится в документации, в этом случае в 'long' вводятся только самые младшие 64 бита. Если самый высокий из этих 64 бит равен 1, это число будет отрицательным. – jonhopkins