2013-03-05 3 views
2

JSTL에서 숫자를 반올림하는 방법에 대해 많은 질문을했습니다. 제 질문은 그 반대입니다. 어떻게 든 내가 wins/total을 계산하면 항상 0 또는 1이됩니다. 패턴은 일관됩니다. wins> = lose이면 결과는 1이고 그렇지 않은 경우 0입니다. 그래서 수학이있는 것처럼 보입니다. 여기 어딘가에서 수행되고 있습니다. 그러나 나는 그것이 어디서 왔는지 전혀 모른다.JSTL 사업부는 자동으로 1 또는 0으로 반올림됩니다.

이 오류를 재현하려고 시도했지만 재현하려고 시도 할 때마다 실제로 예상 한 값 ( 사이에 0과 1)이 나타납니다. 이것은 내가 SQL 쿼리를 수행하고 모델에리스트 결과를 추가하기 때문에 (나는 Spring MVC를 사용하고있다) 왜 문제가 될지 모르지만 문제가 있다고 생각하게 만든다.

스프링 MVC 컨트롤러 코드 :

@RequestMapping(value = "/player/{player}", method = RequestMethod.GET) 
public String player(@PathVariable String player, Model model) { 
    String query = "SELECT v2.player, SUM(IF(v1.result >= 26, 1, 0)) `playerWins`, " + 
      "SUM(IF(v2.result >= 26, 1, 0)) `oppWins` FROM mines_playing AS v1 " + 
      "JOIN mines_playing AS v2 ON (v1.gameid = v2.gameid) AND (v1.playerpos != v2.playerpos) " + 
      "JOIN mines AS v3 ON (v1.gameid = v3.gameid) AND v3.finished = 1 " + 
      "WHERE v1.player = ? AND v3.finished = 1 " + 
      "GROUP BY v2.player " + 
      "ORDER BY playerWins DESC"; 

    Session sess = sessionFactory.openSession(); 
    SQLQuery q = sess.createSQLQuery(query); 
    q.setString(0, player); 
    q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); 

    List<?> list = q.list(); 
    model.addAttribute("size", list.size()); 
    model.addAttribute("winList", list); 
    model.addAttribute("player", player); 

    sess.disconnect(); 
    return "player/playerstats"; 
} 

JSTL 코드 : 내가 잘못

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ page session="false" %> 
(...) 

<c:forEach items="${winList}" var="element"> 
    <c:set var="lost" value="${element['oppWins']}" /> 
    <c:set var="wins" value="${element['playerWins']}" /> 

    <c:set var="total" value="${wins + lost}" /> 
    <c:if test="${total > 0}"> 
    <tr> 
     <td><a href="<c:url value="vs/${element['player']}" />"><c:out value="${element['player']}">Null</c:out></a></td> 
     <td>${total}</td> 
     <td>${wins}</td> 
     <td>${lost}</td> 
     <td>${wins/total}</td> 
    </tr> 
    </c:if> 
</c:forEach> 

을 뭐하는 거지? 왜 wins/total의 가치는 자동으로 반올림됩니까?

+0

fmt 태그를 사용해 보셨습니까? orangegoat

+0

@orangegoat 시도해 보았지만 어쩌면 잘못했거나 작동하지 않았을 수도 있습니다. 그것은 단지'1.00' 또는'0.00'을 가져 왔습니다. 귀하의 코드가 작동하지 않았습니다. –

+0

$ {5/3}이면 1.6666666666666667 – orangegoat

답변

3

"dividable"데이터 유형을 사용하고 있습니까?

숫자로 파싱 해보세요. 좋아요 :

<c:set var="wins" ><fmt:parseNumber type="number" value="${element['playerWins']}" /></c:set> 
<c:set var="lost" ><fmt:parseNumber type="number" value="${element['oppWins']}" /></c:set> 
+0

이전에 어떤 데이터 유형인지 모르지만 완벽하게 작동합니다! –

-1

코드에서 알 수는 없지만, wins와 total이 정수이기 때문에 생각할 수 있습니다. 정수 나눗셈은 정수로 나타납니다.

+0

일 것입니다.'1.0 * wins/total'도 수행하려고했습니다. 같은 결과. 또한, 정수 나누기는 보통 ** 항상 반올림합니다 ** –

+0

실제 분할 표현식을 float/double로 변환하려면'wins/(total * 1.0)'을 시도해야합니다. 당신이 가진 것은 여전히 ​​정수 나누기 표현식을 가지고 있습니다. –

+0

지금 시도했습니다. 같은 결과 :/ –