Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSTL除法自动四舍五入为1或0_Java_Spring Mvc_Jstl_Division - Fatal编程技术网

Java JSTL除法自动四舍五入为1或0

Java JSTL除法自动四舍五入为1或0,java,spring-mvc,jstl,division,Java,Spring Mvc,Jstl,Division,我发现很多关于如何在JSTL中对数字进行四舍五入的问题。我的问题正好相反。不知何故,当我计算胜利/总数以获得胜利百分比时,我总是得到0或1。模式是一致的:如果赢>=输,结果是1,否则为零。看来这里的某个地方正在进行一个数学循环。但我不知道它是从哪里来的 我一直试图重现这个错误,但每当我尝试重现它时,我实际上得到了我期望的值(一个介于0和1之间的值)。这让我觉得问题是因为我正在执行SQL查询,并将列表结果添加到模型中(我使用的是SpringMVC),尽管我不确定为什么会出现问题 Spring MV

我发现很多关于如何在JSTL中对数字进行四舍五入的问题。我的问题正好相反。不知何故,当我计算胜利/总数以获得胜利百分比时,我总是得到0或1。模式是一致的:如果赢>=输,结果是1,否则为零。看来这里的某个地方正在进行一个数学循环。但我不知道它是从哪里来的

我一直试图重现这个错误,但每当我尝试重现它时,我实际上得到了我期望的值(一个介于0和1之间的值)。这让我觉得问题是因为我正在执行SQL查询,并将列表结果添加到模型中(我使用的是SpringMVC),尽管我不确定为什么会出现问题

Spring 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";
}
@RequestMapping(value=“/player/{player}”,method=RequestMethod.GET)
公共字符串播放器(@PathVariable字符串播放器,型号){
String query=“选择v2.player,SUM(如果(v1.result>=26,1,0))`playerWins`,”+
“和(如果(v2.result>=26,1,0))`oppWins`来自作为v1播放的地雷”+
“在(v1.gameid=v2.gameid)和(v1.playerpos!=v2.playerpos)上以v2身份加入游戏”+
“以v3(v1.gameid=v3.gameid)和v3.finished=1的形式加入地雷”+
“其中v1.player=?和v3.finished=1”+
“按v2.player分组”+
“由playerWins DESC订购”;
Session sess=sessionFactory.openSession();
SQLQuery q=sess.createSQLQuery(查询);
q、 设置字符串(0,玩家);
q、 setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List=q.List();
model.addAttribute(“size”,list.size());
model.addAttribute(“winList”,list);
model.addAttribute(“播放器”,播放器);
sess.disconnect();
返回“玩家/玩家状态”;
}
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>

(...)
${total}
${wins}
${lost}
${wins/total}

我做错了什么?为什么wins/total的值会自动四舍五入?

从代码中看不出来,但我认为这是因为wins和total是整数。整数除法产生整数。

是否使用“可除法”数据类型

尝试将其解析为数字。像这样:

<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>


我也一直在尝试执行
1.0*wins/total
。同样的结果。此外,整数除法通常总是向下舍入。您应该尝试
wins/(total*1.0)
将实际除法表达式转换为float/double。你的那个仍然有一个整数除法表达式。现在尝试一下。同样的结果:/
(wins/total)*1.1/1.1
对我很有效<代码>(wins/total)*(1.1/1.1)不起作用,也不起作用
(wins/total)*1.0/1.0
您尝试过使用fmt标签吗@orangegoat我已经试过了,但也许我做错了,或者它不起作用。它只是导致
1.00
0.00
。您在那里的代码也不起作用。如果您只有${5/3},它是否打印为1。6666666666666667@orangegoat对${5/3}变成1.666666666 7我想知道为什么我在这个问题上投了反对票。我希望答案不是
,因为回答
太难了。我不知道它以前是什么数据类型,但这非常有效!