BigDecimal.intValue () возвращает неожиданный номер - PullRequest
3 голосов
/ 24 февраля 2012

Я сталкиваюсь со странной ошибкой Java, используя intValue () из класса BigDecimal.

Я начинаю со значения 3300028000.

Когда я вызываю следующий код:

int i = d.intValue();

возвращается: -994939296

Какие-нибудь идеи относительно того, почему это произойдет?

Ответы [ 5 ]

4 голосов
/ 24 февраля 2012

Int не может содержать такое большое значение, поэтому оно переполняется. Попробуйте использовать длинный.

3 голосов
/ 24 февраля 2012

Когда вы пытаетесь вписать это число в переменную int, оно переполняется, поскольку тип int в Java имеет 32 бита, поэтому переменная int может хранить значения в диапазоне от −2 147 483 648 до 2 147 483 647.сохранить значение вашего BigInteger, вы должны использовать длинную переменную.Попробуйте это:

long value = d.longValue();
2 голосов
/ 24 февраля 2012

Что бы вы хотели вернуть? :)

Как описано в javadocs :

если получившийся BigInteger слишком большой, чтобы поместиться в int, только младшие 32 бита возвращаются

intValueExact , с другой стороны, вызовет исключение.

1 голос
/ 24 февраля 2012

Вы должны действительно прочитать Java API , прежде чем обвинять его:

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

0 голосов
/ 05 августа 2014

Я не знаю, зачем вам нужно значение int для BigDecimal, но класс BigDecimal содержит множество методов, чтобы соответствовать вашему запросу.

compareTo 
add 
substract 
multiply 
divide

и т.д ..

Я бы работал с самой BigDecimal. Рано или поздно; Преобразование типа BigDecimal в другие примитивные типы приведет к ошибке. Потому что у них всех есть предел.

...