티스토리 뷰
최근 thymeleaf 로 통계 데이터를 뿌려주는 과정에서
일부 데이터를 직접 thymeleaf 구문에서 가공을 한적이 있는데
데이터형에 대한 의문이 생겨 남겨본다.
내가 의문을 가지게 된 부분은 나눗셈을 하여 백분율을 구하는 부분이었는데
<th:block th:each="data : ${tableData}">
<td th:with="rate=${data.value*1.0/tableData[dataStat.index-1].value}"
th:text="${#numbers.formatPercent(rate,1,1)}">
</td>
</th:block>
보통 위 구문처럼 value 라는 필드가 int 형이라는 가정하에
*1.0 을 곱해주어 실수(double) 형을 만들고 나누었을때
rate 값은 생각대로 0.83333333333 의 소숫점 실수형으로 계산되어
numbers.formatPercent 를 사용하면 83.3% 라는 예쁜 백분율이 작성되었었다.
<td th:with="
rVal=${#aggregates.sum(tableData.?[reserveType.equals('예약')].![value])*1.0},
aVal=${#aggregates.sum(tableData.?[reserveType.equals('접수')].![value])}"
th:text="${#numbers.formatPercent(rVal/aVal,1,1)}">
</td>
그래서 합산값의 백분율을 구하기 위해서 위의 코드처럼
동일하게 *1.0 을 해주고 나눴으나 ... 소수점 둘째자리에서 강제 반올림을 해버리는 현상을 발견했다.
내 예상은 0.51428571... 이렇게 계산될 거라 생각했으나
그냥 0.5 로 반올림되어 계산되었다.
그래서 내가 원하는 대로 값을 얻으려면 아래와 같이 1.0을 원하는 자리수 만큼 곱해줘야 했다.
<td th:with="
rVal=${#aggregates.sum(tableData.?[reserveType.equals('예약')].![value])*1.0*1.0*1.0},
aVal=${#aggregates.sum(tableData.?[reserveType.equals('접수')].![value])}"
th:text="${#numbers.formatPercent(rVal/aVal,1,1)}">
</td>
이렇게 1.0을 3번 곱하여야 소수점 셋째자리 까지 표기되어 0.514 의 값이 나오는 것을 확인했다.
#aggregates.sum() 유틸 내부에서 자동 반올림을 하는 것일까?
그렇다기엔 합계값을 얻은 상태에서 실수형으로 만들어 주고 나눗셈 계산을 하였기에
내 머리로는 이해가 안되는 상황이다.
thymeleaf 의 데이터타입은 java 를 어느정도 따르는 것으로 알고 있는데
실수형 나눗셈 한 것을 소수점이 고정적으로 잡혀 반올림처리 하는 것은
타임리프 어느 부분에서 처리 할 것으로 보여지는데
아직은 정확히 알아내지는 못했다.
이 부분에 대한 내부 동작방식을 쫌 더 봐야할 듯 싶다.
이 부분에 대해 이론적으로 아시는 분은 답변주시면 감사드립니다.
'Java > SpringBoot&Spring' 카테고리의 다른 글
[Springboot] 외부 라이브러리 추가 (feat.intelliJ) (0) | 2024.06.18 |
---|---|
[Thymeleaf] preprocessing expressions; 전처리 표현식을 동적으로 사용. (1) | 2024.06.14 |
[thymeleaf] 비동기 화면 갱신 (feat.fetch) (0) | 2024.05.07 |
[thymeleaf] Expression Utility 로 데이터 백분율 row 추가하기. (0) | 2024.05.03 |
[SpringBoot] 정적리소스 cache control 설정. (2) | 2024.03.29 |