Eu tenho o método Hibernate que me retorna um BigDecimal. Eu tenho outro método de API para o qual preciso passar esse número, mas ele aceita Inteiro como parâmetro. Não posso alterar os tipos de retorno ou os tipos variáveis dos dois métodos.
Agora, como converter o BigDecimal em número inteiro e passá-lo para o segundo método?
Existe uma maneira de sair disso?
java
integer
casting
bigdecimal
Vishal
fonte
fonte
Respostas:
Você telefonaria
myBigDecimal.intValueExact()
(ou apenasintValue()
) e isso causará uma exceção se você perder informações. Isso retorna um int, mas o autoboxing cuida disso.fonte
intValueExact()
é uma boa recomendação; foi adicionado em 1,5intValue()
é perigoso, a menos que você esteja 100% apostando sua vida com a certeza de que o número está dentro doInteger
intervalo.Você pode garantir que
BigDecimal
nunca conterá um valor maior queInteger.MAX_VALUE
?Se sim, então aqui está a sua chamada de código
intValue
:fonte
TL; DR
Use um destes para necessidades de conversão universal
Raciocínio
A resposta depende de quais são os requisitos e como você responde a essas perguntas.
BigDecimal
potencial terá uma parte fracionária diferente de zero?BigDecimal
potencialmente não se encaixam noInteger
intervalo?Se você respondeu não às 2 primeiras perguntas, você pode simplesmente usar
BigDecimal.intValueExact()
como as outras pessoas sugeriram e deixar explodir quando algo inesperado acontecer.Se você não está absolutamente 100% confiante sobre a pergunta número 2, sempre
intValue()
é a resposta errada.Tornando-o melhor
Vamos usar as seguintes premissas com base nas outras respostas.
intValueExact()
boxe automático fazBigDecimal
for maior que oInteger
intervalo, porque qualquer outra coisa ficaria louca, a menos que você tenha uma necessidade muito específica de contornar o que acontece quando você solta os bits de alta ordem.Dados esses parâmetros,
intValueExact()
lança uma exceção quando não queremos que nossa parte fracionária seja diferente de zero. Por outro lado,intValue()
não lança uma exceção quando deveria, se a nossaBigDecimal
for muito grande.Para obter o melhor dos dois mundos, termine o
BigDecimal
primeiro e depois converta. Isso também tem o benefício de oferecer a você mais controle sobre o processo de arredondamento.Spock Groovy Test
fonte
Bem, você poderia ligar para
BigDecimal.intValue()
:Você pode ligar explicitamente
Integer.valueOf(int)
ou deixar o boxe automático fazer isso por você, se estiver usando uma versão suficientemente recente do Java.fonte
A seguir, faça o truque:
fonte
Você já tentou chamar BigInteger # intValue () ?
fonte
Consulte BigDecimal # intValue ()
fonte
Eu descobri que o acima não funcionou para mim. Eu estava puxando um valor de célula de uma JTable, mas não foi possível converter para double ou int etc. Minha solução:
onde a linha 0 sempre seria um número. Espero que isso ajude alguém ainda rolando!
fonte