J'ai la méthode Hibernate qui me renvoie un BigDecimal. J'ai une autre méthode API à laquelle je dois transmettre ce numéro mais elle accepte Integer comme paramètre. Je ne peux pas modifier les types de retour ou les types de variables des deux méthodes.
Maintenant, comment convertir le BigDecimal en Integer et le passer à la deuxième méthode?
Y a-t-il un moyen de s'en sortir?
java
integer
casting
bigdecimal
Vishal
la source
la source
Réponses:
Vous appelleriez
myBigDecimal.intValueExact()
(ou simplementintValue()
) et cela lèverait même une exception si vous perdiez des informations. Cela renvoie un int, mais l'auto-box s'en charge.la source
intValueExact()
est une bonne recommandation; il a été ajouté dans la 1.5intValue()
est dangereux à moins que vous ne pariez à 100% sur votre vie en étant sûr que le numéro est dans laInteger
fourchette.Pouvez-vous garantir que le
BigDecimal
ne contiendra jamais une valeur supérieure àInteger.MAX_VALUE
?Si oui, voici votre code appelant
intValue
:la source
TL; DR
Utilisez l'un de ceux-ci pour les besoins de conversion universels
Raisonnement
La réponse dépend des exigences et de la manière dont vous répondez à ces questions.
BigDecimal
potentiellement une partie fractionnaire non nulle?BigDecimal
potentiel ne rentrera- t-il pas dans laInteger
gamme?Si vous avez répondu non aux 2 premières questions, vous pouvez simplement utiliser
BigDecimal.intValueExact()
comme d'autres l'ont suggéré et laisser exploser quand quelque chose d'inattendu se produit.Si vous n'êtes pas absolument sûr à 100% de la question numéro 2,
intValue()
c'est toujours la mauvaise réponse.Faire mieux
Utilisons les hypothèses suivantes basées sur les autres réponses.
intValueExact()
et l'auto-boxingBigDecimal
est plus grand que laInteger
plage car tout le reste serait fou à moins que vous n'ayez un besoin très spécifique pour le bouclage qui se produit lorsque vous supprimez les bits de poids fort.Étant donné ces paramètres,
intValueExact()
lève une exception lorsque nous ne le voulons pas si notre partie fractionnaire est non nulle. D'autre part,intValue()
ne lève pas d'exception quand il le devrait si notreBigDecimal
est trop grand.Pour tirer le meilleur parti des deux mondes, arrondissez le
BigDecimal
premier, puis convertissez-vous. Cela a également l'avantage de vous donner plus de contrôle sur le processus d'arrondi.Test de Spock Groovy
la source
Eh bien, vous pouvez appeler
BigDecimal.intValue()
:Vous pouvez alors appeler explicitement
Integer.valueOf(int)
ou laisser l'auto-boxing le faire pour vous si vous utilisez une version suffisamment récente de Java.la source
Ce qui suit devrait faire l'affaire:
la source
Avez-vous essayé d'appeler BigInteger # intValue () ?
la source
Voir BigDecimal # intValue ()
la source
J'ai trouvé que ce qui précède ne fonctionnait pas pour moi. J'étais en train d'extraire une valeur de cellule d'un JTable mais je n'ai pas pu convertir en double ou int, etc. Ma solution:
où la ligne 0 serait toujours un nombre. J'espère que cela aide tout le monde à faire défiler encore!
la source