2016-09-12 8 views
0

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

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

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

+0

Это может случиться «, если в результате„BigInteger“слишком большой, чтобы поместиться в long ", а верхний бит из последних 64 бит равен' 1'. – resueman

+0

Скажем, целая часть 'BigDecimal' будет представлять 75 бит для представления. Это слишком велико, чтобы вписаться в «длинный». Как говорится в документации, в этом случае в 'long' вводятся только самые младшие 64 бита. Если самый высокий из этих 64 бит равен 1, это число будет отрицательным. – jonhopkins

ответ

5

Это возможно, когда значение 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 
0

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

BigDecimal dec = new BigDecimal(Long.MAX_VALUE +1); 
System.out.println(dec.longValue()); 
+2

'Long.MAX_VALUE + 1' -' -9223372036854775808', поэтому значение 'BigDecimal' будет иметь значение' -9223372036854775808', а 'longValue()' будет возвращать * точное значение * без переполнения. – Andreas