Java, BigDecimal. Problèmes avec la division
Je suis en train de calculer un pourcentage de "facteur". C'est, à 20%, de le convertir en 0.2 (mon intention est pour plus tard, multiplier les valeurs par qui et récupérer les 20% des valeurs).
De toute façon, la question est en lien avec ce morceau de code:
public static void main(String[] args) {
int roundingMode = BigDecimal.ROUND_FLOOR;
BigDecimal hundred = new BigDecimal("100");
BigDecimal percentageFactor = null;
BigDecimal percentage = new BigDecimal("20");
BigDecimal value = new BigDecimal("500");
percentageFactor = percentage.divide(hundred, roundingMode);
float f = percentage.floatValue() / hundred.floatValue();
f = value.floatValue() * f;
BigDecimal aux = value.multiply(percentageFactor);
System.out.println("factor:"+percentageFactor.toString());
System.out.println("final falue:"+aux.toString());
System.out.println("Float Value:"+f);
}
Je m'attends à ce que le résultat de ce être quelque chose comme:
factor: 0.2
final value: 100
float value: 100
mais au lieu percentage.divide(hundred, roundingMode);
est de retour à zéro, donc j'obtiens:
factor:0
final falue:0
Float Value:100.0
Ce que je fais mal? Comment puis-je diviser en deux grandes décimales correctement?
En passant, je suis en utilisant BigDecimal
parce que je serai calcul des pourcentages, donc je veux de contrôle concernant l'arrondissement.
source d'informationauteur gonso
Vous devez vous connecter pour publier un commentaire.
Je pense que la meilleure solution est de définir la demande à l'échelle lors de la division: Dans ce cas, peut-être 2.
valeur finale de 100,00
(La Multiplication est l'aide de l'échelle de l'facteurs (0+2), mais il peut être spécifié.)
J'utiliserais HALF_UP pour la comptabilité (dans mon législation), ou ENCORE (pour les statistiques) pour le mode d'arrondi.
L'échelle de
new BigDecimal("20")
est zéro parce que vous avez pas de point décimal. Cela signifie que votrepercentage.divide(hundred, BigDecimal.ROUND_FLOOR)
va produire zéro (c'est effectivementint(20/100)
ou0
).Si vous voulez vraiment faire de fractions de trucs, utilisez
new BigDecimal("20.00")
donc l'échelle est réglée correctement, ou utiliser l'une des autres constructeurs pour définir l'échelle spécifiquement.Voici la sortie de la simple changement de
20
à20.00
complet avec votre spellink misteak 🙂flotteur a que 6 chiffres de précision et n'est presque jamais un bon choix, je vous suggère d'utiliser la double à la place. (ou BigDecimal peut être mieux dans certains cas)
vous voudrez probablement utiliser ROUND_UP comme mode d'arrondi