У меня есть метод Hibernate, который возвращает мне BigDecimal. У меня есть другой метод API, которому нужно передать это число, но он принимает целое число в качестве параметра. Я не могу изменить возвращаемые типы или типы переменных обоих методов.
Как теперь преобразовать BigDecimal в Integer и передать его второму методу?
Есть ли выход из этого?
java
integer
casting
bigdecimal
Вишал
источник
источник
Ответы:
Вы бы позвонили
myBigDecimal.intValueExact()
(или простоintValue()
), и он даже вызовет исключение, если вы потеряете информацию. Это возвращает int, но автобоксинг позаботится об этом.источник
intValueExact()
хорошая рекомендация; это было добавлено в 1.5intValue()
опасен, если вы не ставите на 100% свою жизнь и уверены, что число находится в пределахInteger
диапазона.Можете ли вы гарантировать, что
BigDecimal
никогда не будет содержать значение больше чемInteger.MAX_VALUE
?Если да, то вот ваш код вызова
intValue
:источник
TL; DR
Используйте один из них для универсального преобразования
аргументация
Ответ зависит от требований и того, как вы ответите на эти вопросы.
BigDecimal
потенциально иметь ненулевую дробную часть?BigDecimal
Не впишется ли потенциально вInteger
диапазон?Если вы ответили «нет» на первые 2 вопроса, вы можете просто использовать,
BigDecimal.intValueExact()
как предлагали другие, и позволить этому взорваться, когда произойдет что-то неожиданное.Если вы не на 100% уверены в вопросе номер 2, то
intValue()
это всегда неправильный ответ.Делая это лучше
Давайте использовать следующие предположения, основанные на других ответах.
intValueExact()
делает автобокс.BigDecimal
больше, чемInteger
диапазон, потому что все остальное было бы сумасшедшим, если у вас нет особой потребности в обертке, которая происходит, когда вы отбрасываете старшие биты.Учитывая эти параметры,
intValueExact()
выдает исключение, если мы этого не хотим, если наша дробная часть не равна нулю. С другой стороны,intValue()
не генерирует исключение, если должно, если нашBigDecimal
слишком велик.Чтобы получить лучшее из обоих миров, округлите
BigDecimal
первый, а затем конвертируйте. Это также дает вам больше контроля над процессом округления.Спок Groovy Test
источник
Ну, вы могли бы позвонить
BigDecimal.intValue()
:Затем вы можете либо явно вызвать,
Integer.valueOf(int)
либо позволить автоматической упаковке делать это за вас, если вы используете достаточно последнюю версию Java.источник
Следующее должно помочь:
источник
Вы пробовали вызвать BigInteger # intValue () ?
источник
См. BigDecimal # intValue ()
источник
Я обнаружил, что это не помогло мне. Я извлекал значение ячейки из JTable, но не мог преобразовать его в double или int и т. Д. Мое решение:
где строка 0 всегда будет числом. Надеюсь, это поможет всем, кто все еще прокручивает!
источник