我在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不同的结果?