Outline
Я использую Spring MVC и JSP в проекте веб-приложения.JSTL используется для округления значений до 2 десятичных знаков во время отображения.
У меня есть следующий объект 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
}
Вот часть, где я устанавливаю тестируемые значения BigDecimal в объектах AreaData и передаюв 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