2010-01-09 7 views
1

Le problème avec ce code a été retenu de 0% (Je veux parler de 0% si le nombre de livres empruntés est de 14 et le nombre total de livres empruntés de l'auteur sélectionné est 3 - il devrait être 21,42%). Pourquoi cela arrive-t-il?Problème de calcul dans JSP

Tous les résultats sont corrects, sauf le dernier:

Auteur est 0% populaire (pour les données ci-dessus données)

<% 
String requestedoprations = request.getParameter("popularity"); 
if("check".equalsIgnoreCase(requestedoprations)){ 
    int num=LimsHandler.getInstance().popularitycheck(
     request.getParameter("selectedauthor")); 
    if(num!=0){ 
     Limsdetails[] list = LimsHandler.getInstance().libsdetails(); 
     String totbks=list[0].getTot_books(); 
     String totbrwdbk=list[0].getTot_borrowed_bks(); 
     int totbksint=Integer.parseInt(totbks); 
     int totbrwdbksint=Integer.parseInt(totbrwdbk); 
     float per=(num/totbrwdbksint)*100;   
%> 
<font color="brown"> 
    <b>Total No of Books Available in Library is : <%=totbksint %><br></br> 
    Out of which <%=totbrwdbksint %> are borrowed.<br></br> 
    <b>No of readers reading Author 
     <%=request.getParameter("selectedauthor") %>'s book. : 
     <%=num %></b><br></br> 
    <b> Author <%=request.getParameter("selectedauthor") %> is <%=per %> % 
     popular!</b><br></br> 
</font> 

<%}else{ %> 
    <h4 align="center"> 
     <font color="red"> 
      <img border="0" src="images/close.PNG" ><br></br> 
      Oops! some error occurred! 
     </font> 
    </h4> 
<% 
} 
out.flush(); 
%> 

<%} %> 
+1

Les scriptlets sont déconseillés depuis 2001. Écrivez du code Java dans des classes Java réelles. Utilisez taglibs/EL dans JSP pour contrôler le flux de la page et accéder aux données. La balise HTML est obsolète depuis 1998. Utilisez CSS. Et s'il vous plaît jeter ces anciens livres/tutoriels loin et aller chercher des décents. Tout cela ressemble au style roseindia.net, assurez-vous de ne pas utiliser ce site comme "référence". – BalusC

Répondre

5

Ce n'est pas vraiment un problème JSP - il est comment Java traite entier arithmétique. Les lignes concernées sont les suivantes:

int num = LimsHandler.getInstance().popularitycheck(...); 
int totbrwdbksint = Integer.parseInt(totbrwdbk); 
float per = (num/totbrwdbksint) * 100; 

Vous effectuez une division « int/int » puis multiplier par 100. Ce effectuera la division avec l'arithmétique entière - donc le résultat sera 0. Multipliant 0 par 100 donne toujours 0.

La solution la plus simple consiste à définir l'une des valeurs float ou double. Par exemple:

int num = LimsHandler.getInstance().popularitycheck(...);  
float totbrwdbksint = Integer.parseInt(totbrwdbk); 
float per = (num/totbrwdbksint) * 100; 

Sinon, vous pouvez jeter dans l'expression:

int num = LimsHandler.getInstance().popularitycheck(...); 
int totbrwdbksint = Integer.parseInt(totbrwdbk); 
float per = (num/(float) totbrwdbksint) * 100; 

A ce stade, la division sera effectuée en utilisant l'arithmétique en virgule flottante, et vous obtiendrez la réponse que vous attendez.

+1

Personnellement, je préfèrerais aussi (100 * num)/totbrwdbksint. Cela peut augmenter un peu la précision si num est significativement plus petit que totbrwdbksint. – extraneon

+0

génial cela a fonctionné.thanx beaucoup.peux-tu me dire une chose de plus. le résultat est quelque chose comme 26.323232% .je veux qu'il arrondisse jusqu'à 2 endroits decimaol. Comment faire cela? –

+0

@extraneon: D'un autre côté, cela conduit à un débordement potentiel si 'num' est très grand :) –

0

La façon dont votre calcualtion

float per=(num/totbrwdbksint)*100 

est réalisée est le résultat étant arrondi de (num/totbrwdbksint) à zéro.

Essayez

float per=((float)num/(float)totbrwdbksint)*100 

pour obtenir un meilleur résultat.

1

Ce n'est pas une solution à votre question initiale, mais je recommande d'apprendre deux choses nouvelles:

  1. JSTL
  2. CSS

Vous devriez avoir ni scriptlets ni style intégré dans votre JSPs par ici. Vous vous remerciez d'avoir fait l'effort un jour, car la maintenance et la restylation de vos pages seront beaucoup plus faciles.