Почему JSTL fmt: formatNumber возвращает разные результаты в зависимости от типа значения? - PullRequest
0 голосов
/ 23 октября 2018

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

...