Question

J'essaie de prendre deux nombres à 7 chiffres (comptes d'enregistrement source et cible) et de calculer le pourcentage d'enregistrements manquants dans le nombre cible.

Par exemple, le nombre de mes enregistrements pourrait être 4084094 pour la source et 4081313 pour la cible. J'utilise également la formule suivante pour calculer le pourcentage: ((1 - (cible / source)) * * 100)

Pour mon exemple, je devrais obtenir la valeur d'environ 0,0681%

Je suis nouveau sur Java et JSP et je ne parviens pas à obtenir le pourcentage affiché correctement. Il semble que je n’obtienne qu’une valeur arrondie à 0.

J'ai aussi essayé BigDecimal, en vain.

Même le code simple suivant affiche la valeur de 1-1, je fais donc visiblement très mauvais travail:

<%
BigDecimal percentMiss;
long tmp = 600/500;
percentMiss = BigDecimal.valueOf(tmp);
%>
<%=percentMiss.toString()%>-<%=tmp%>
Était-ce utile?

La solution

Le problème se trouve dans la ligne suivante

long tmp = 600/500;

Vous ne pouvez pas stocker les nombres à virgule flottante longtemps, vous devriez plutôt envisager d'utiliser le code suivant:

double tmp = (double)600 / (double)500;

puis affichez tmp, qui devrait avoir une valeur comprise entre 0 et 1 (dans votre cas, 1.2, car vous devez modifier votre calcul en 500/600)

Autres conseils

Le problème est évidemment que vous divisez deux nombres longs.

Je recommanderais d'utiliser DecimalFormat pour afficher le numéro. Si vous utilisez JSTL, une solution encore meilleure consiste à utiliser balises de format :

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<fmt:formatNumber value="${value}" minFractionDigits="2" maxFractionDigits="2"/>

Votre problème est que 600 et 500 sont des valeurs entières, et une division entre elles donnera un résultat entier, que vous affectez à un entier long. Ensuite, la fraction du résultat est partie (deux fois) et vous ne pouvez pas la récupérer.

Pour obtenir un résultat fractionnaire, au moins une des valeurs d'entrée de la division doit être non entière. Pour ce faire, vous pouvez les convertir en double ou float , ou en faisant en sorte que les littéraux soient explicitement doublés ou flottants comme suit:

500.0 // implicitly double
500f // float literal
500d // double literal

Cependant, l'impression du résultat d'une division double / float aura souvent plus de décimales que vous ne le souhaitez, même si elles ne doivent pas figurer dans le résultat (par exemple, 1/10 peut générer 0.100000001490116119384765625 ), en raison de la façon dont ces numéros sont stockés sous forme de fractions binaires .

Vous pouvez éliminer ces chiffres non désirés en utilisant java.lang.DecimalFormat , mais BigDecimal est une meilleure option car il utilise en interne des fractions décimales et fournit donc le corriger les résultats tout en offrant un contrôle exact sur les modes d'arrondi. Bien sûr, cela nécessite que vous utilisiez BigDecimal pour le calcul lui-même, plutôt que comme "ingrédient vaudou". pour corriger un résultat déjà cassé.

new BigDecimal(600).divide(new BigDecimal(500))

Lisez la documentation d'API pour BigDecimal. pour plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top