Garniture de Plus de deux Zéros à droite dans BigDecimal
Ce serait une bonne façon de couper plus de deux zéros pour un BigDecimal
Donc 1.2200 serait d'imprimer 1.22 et 1,0000 serait d'imprimer 1.00
Modifier ainsi Que le retour 1.222200 comme
1.2222 et 1.220000001 comme 1.220000001 etc. Donc, ignorant les deux premiers zéros je veux couper les entrants 0 et de ne pas découper les valeurs non nulles
Une façon peut être de se multiplier, puis appliquer le construit en garniture de zéros à droite et puis à diviser par 100. Il pourrait être difficile dans le cas du coin mais les valeurs de mon problème de monnaie de base et ne jamais dépasser les limites fixées par Java (ou autre chose, elle signifie que mon logiciel est de traiter avec les offres qui sont dans gazzilions de dollars)
Le laid solution est comme épouse
System.out.println(((new BigDecimal("1.230223000")
.multiply(new BigDecimal("100.0"))
.stripTrailingZeros()).divide(new BigDecimal("100.0"))));
- notez que vos nouvelles exigences en conflit avec vos originaux: comment peut -
1.230223000
être transformé en1.230223
, mais1.0000
doit imprimer1.00
? - aucune d'elles ne Joachim. lire de nouveau. Je veux ignorer les deux premiers zéros après la virgule pour le découpage. Et l'entrée sera toujours de atleast x.xx type
- yep, j'ai réalisé qu'après que j'ai posté mon commentaire. Est-ce que mon (mise à jour) réponse de l'aide?
Vous devez vous connecter pour publier un commentaire.
Le vérifier,
new BigDecimal("1.234")
qui (selon les besoins) doit être imprimé dans son intégralité.Mise à jour: le fait de les Avoir mélangé les exigences (c'est à dire au moins 2 chiffres après le point décimal doit être affiché, mais comme beaucoup que nécessaire) n'est pas trivialement mis en œuvre, mais vous pouvez venir près:
Combiner
stripTrailingZeros()
avecDecimalFormat
pour obtenir le comportement souhaité (ou presque):Ce sera le format tout
BigDecimal
valeur avec au moins 2 chiffres après le point décimal et jusqu'à 10 chiffres après la virgule, si elle améliore la précision.BigDecimal
valeurs avec plus de 10 chiffres après le point décimal sera toujours coupé:Réponse originale à cette question:
Si vous voulez toujours avoir exactement 2 chiffres après la virgule et sachez que vous ne perdrez pas de précision de cette façon, vous pouvez appeler
setScale(2, RoundingMode.INUTILE)
:Ce code affichera
1.23
. Notez que cette va lancer uneArithmeticException
lors de l'arrondissement serait nécessaire (c'est à dire quoi que ce soit après les 2 premiers chiffres n'est pas nul).Si vos valeurs peuvent avoir une plus grande précision et que vous souhaitez appliquer quelques erreurs, il suffit de remplacer
RoundingMode.UNNECESSARY
avec la valeur appropriée:Cette impression sera
1.24
.Si vous ne connaissez pas le nombre exact de chiffres, mais qui veulent aussi peu que possible (c'est à dire que vous voulez le plus petit possible
scale
pour votreBigDecimal
), puis de l'appelstripTrailingZeros()
permettra de faire exactement ce que vous voulez:Cette impression sera
1.230001
.Cette méthode vous donnera le résultat que vous souhaitez (monétaire tour):
(qu'est-ce que la Chaîne parce que c'est mieux pour BigDecimal voir la documentation)
Si c'est pour l'affichage des fins d'utilisation:
Pour la sortie comme
String
, utilisezDecimalFormat
.Sinon, utilisez ceci: