为什么JSTL fmt:formatNumber根据值类型返回不同的结果?

时间:2018-10-23 12:33:25

标签: java jsp jstl bigdecimal

概述

我在Web应用程序项目中使用Spring MVC和JSP。 JSTL用于在显示期间将值四舍五入到小数点后两位。

我有以下java对象:

public class AreaData {
    private BigDecimal area;

    public void setArea(BigDecimal area) {
        this.area = area;
    }
    public BigDecimal getArea(BigDecimal area) {
        return this.area;
    }
    // other currently irrellevant fields
}

这里是我在AreaData对象中设置受测试的BigDecimal值并传递给JSP的部分:

List<AreaData> areas = new ArrayList<>();
AreaData a1 = new AreaData();
AreaData a2 = new AreaData();
a1.setArea(new BigDecimal("4.565"));
a2.setArea(new BigDecimal("4.575"));
areas.add(a1);
areas.add(a2);
model.addAttribute("areas", areas);

这里是JSP的一部分。我有4列显示未格式化和不同格式的区域值:

<table>
    <thead>
        <tr>
            <th>Actual</th>
            <th>BigDecimal</th>
            <th>doubleValue()</th>
            <th>floatValue()</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach var="areaData" items="${areas}">
            <tr class="areaRow">
                <td>${areaData.area}</td>
                <td><fmt:formatNumber type="number" minFractionDigits="2" maxFractionDigits="2" value="${areaData.area}"/></td>
                <td><fmt:formatNumber type="number" minFractionDigits="2" maxFractionDigits="2" value="${areaData.area.doubleValue()}"/></td>
                <td><fmt:formatNumber type="number" minFractionDigits="2" maxFractionDigits="2" value="${areaData.area.floatValue()}"/></td>
            </tr>
        </c:forEach>
    </tbody>
</table>

问题

jsp上的输出如下:

Actual  BigDecimal  doubleValue()  floatValue()
4.565   4.56        4.57           4.57
4.575   4.58        4.58           4.57 

通过下面的链接,我了解到fmt:formatNumber使用RoundingMode:HALF_EVEN来解释BigDecimal列的输出。

问题

为什么将doubleValue()或floatValue()传递给jstl formatNumber会得到与BigDecimal不同的结果?

0 个答案:

没有答案