티스토리 뷰

반응형

 

 

 

 



 

 

thymeleaf

 

 

 

최근 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 를 어느정도 따르는 것으로 알고 있는데

실수형 나눗셈 한 것을  소수점이 고정적으로 잡혀 반올림처리 하는 것은

타임리프 어느 부분에서 처리 할 것으로 보여지는데

 

아직은 정확히 알아내지는 못했다.

이 부분에 대한 내부 동작방식을 쫌 더 봐야할 듯 싶다.

 

 

 

 

 

이 부분에 대해 이론적으로 아시는 분은 답변주시면 감사드립니다.

 

 

 

 

 



 

 

반응형
댓글
반응형
최근에 올라온 글
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Total
Today
Yesterday