Tengo el método Hibernate que me devuelve un BigDecimal. Tengo otro método API al que necesito pasar ese número, pero acepta Integer como parámetro. No puedo cambiar los tipos de retorno o los tipos de variables de ambos métodos.
Ahora, ¿cómo convertir BigDecimal en Integer y pasarlo al segundo método?
¿Hay alguna forma de salir de esto?
java
integer
casting
bigdecimal
Vishal
fuente
fuente
Respuestas:
Llamaría
myBigDecimal.intValueExact()
(o simplementeintValue()
) e incluso arrojará una excepción si pierde información. Eso devuelve un int pero el autoboxing se encarga de eso.fuente
intValueExact()
es una buena recomendación fue agregado en 1.5intValue()
es peligroso a menos que esté 100% seguro de que su vida es segura de que el número está dentro delInteger
rango.¿Puede garantizar que
BigDecimal
nunca contendrá un valor mayor queInteger.MAX_VALUE
?En caso afirmativo, aquí está su código de llamada
intValue
:fuente
TL; DR
Utilice uno de estos para las necesidades de conversión universal.
Razonamiento
La respuesta depende de cuáles son los requisitos y cómo responde a estas preguntas.
BigDecimal
potencialmente una parte fraccionaria distinta de cero?BigDecimal
Potencialmente no encajará en elInteger
rango?Si respondió no a las 2 primeras preguntas, puede usarlas
BigDecimal.intValueExact()
como otros han sugerido y dejar que explote cuando ocurra algo inesperado.Si no está 100% seguro de la pregunta número 2, entonces siempre
intValue()
es la respuesta incorrecta.Haciéndolo mejor
Usemos los siguientes supuestos basados en las otras respuestas.
intValueExact()
y el auto-boxeoBigDecimal
sea mayor que elInteger
rango porque cualquier otra cosa sería una locura a menos que tenga una necesidad muy específica de la envoltura que ocurre cuando suelta los bits de alto orden.Dados esos parámetros,
intValueExact()
arroja una excepción cuando no queremos que nuestra parte fraccional sea distinta de cero. Por otro lado,intValue()
no arroja una excepción cuando debería si nuestroBigDecimal
es demasiado grande.Para obtener lo mejor de ambos mundos, completa el
BigDecimal
primero y luego convierte. Esto también tiene el beneficio de darle más control sobre el proceso de redondeo.Prueba de Spock Groovy
fuente
Bueno, puedes llamar
BigDecimal.intValue()
:Luego puede llamar explícitamente
Integer.valueOf(int)
o dejar que el auto-boxeo lo haga por usted si está utilizando una versión suficientemente reciente de Java.fuente
Lo siguiente debería hacer el truco:
fuente
¿Has intentado llamar a BigInteger # intValue () ?
fuente
Ver BigDecimal # intValue ()
fuente
Descubrí que lo anterior no funcionó para mí. Estaba extrayendo un valor de celda de una JTable pero no podía convertir a doble o int, etc. Mi solución:
donde la fila 0 siempre sería un número. ¡Espero que esto ayude a cualquiera que todavía se esté desplazando!
fuente