본문 바로가기
Spring/ETC

[Java] Double Type 은 Integer 타입과의 연산에서 소수점을 버린다.

by YoonJong 2023. 7. 22.
728x90

Double Type 은 Integer 타입과 연산할 때 소수점을 버리게 되어,  연산 시 다시한번 더 해당 내용을 상기시키며 로직을 작성해야 합니다. 돈과 관련된 내용이라면 더욱더 타입이 달랐을 때를 생각해야 합니다.

 

querydsl 에서는 mutiply() 라는 메서드를 제공하고 있습니다.

정말 단순히 생각하면 곱하기를 해주는 메서드이기 때문에, 그냥 사용하는 경우가 있습니다. 

 

저 같은 경우에는, 환불금액에 관련된 querydsl 로직을 작성하던 중 해당 금액에 대한 20% 의 값을 구해 그 값을 사용해야 했었는데 단순히 mutiply(0.2) 를 해 테스트를 해보았더니 모든 결과값이 0 으로 발생했습니다.

 

아래는 정상적으로 통과하는 테스트 코드입니다.

모든 Q 타입의 객체는 Integer 타입입니다.

@Test
@DisplayName("Double Type 은 Integer 와의 연산에서는 소수점 자리를 버린다.")
void querydslMultiplyTest() {

   Integer originalPrice = queryFactory
      .select(pointMart.issuedPoint)
      .from(pointMart)
      .orderBy(pointMart.issuedPoint.desc())
      .fetchFirst();

   Integer doubleTypeMultiply = queryFactory
      .select(pointMart.issuedPoint.multiply(0.2))
      .from(pointMart)
      .orderBy(pointMart.issuedPoint.desc())
      .fetchFirst();

   Integer integerTypeMultiply = queryFactory
      .select(pointMart.issuedPoint.multiply(2).divide(10))
      .from(pointMart)
      .orderBy(pointMart.issuedPoint.desc())
      .fetchFirst();

   System.out.println("originalPrice = " + originalPrice);
   System.out.println("doubleTypeMultiply = " + doubleTypeMultiply);
   System.out.println("integerTypeMultiply = " + integerTypeMultiply);

   assertThat(doubleTypeMultiply).isEqualTo(0);
   assertThat(integerTypeMultiply).isEqualTo(20000);
   assertThat(doubleTypeMultiply).isNotEqualTo(integerTypeMultiply);

}

 

originalPrice 값은 100,000원이며, 테스트와 같이 0.2 를 했을 경우에는 소수점 자리를 버리기 때문에 0을 리턴합니다.

따라서, 옳바른 값을 리턴하기 위해서는 2를 곱해주고 10을 나눠주는 Integer 타입으로 계산을 해야합니다.

 

아래는 GPT 의 답변입니다.

해당 코드에서 0.2는 double 타입으로 인식되기 때문에 Integer와의 연산에서
double 타입의 값으로 처리됩니다. 그래서 queryFactory.select(pointMart.issuedPoint.multiply(0.2))
에서 pointMart.issuedPoint가 Integer 타입이므로, 
multiply 연산에서 0.2가 double 타입으로 해석되면서 결과가 double 타입이 되고 
이후 Integer로 변환될 때 소수점 이하는 버려지면서 0이 되는 것입니다.
728x90

'Spring > ETC' 카테고리의 다른 글

동적 프록시란 ?  (0) 2023.08.11
Java Bean / POJO / Spring Bean 간단 설명  (1) 2023.07.29
var 타입은 사용하는 것이 좋을까 ? - in Java  (0) 2023.07.16
Linux Json File UTF-8 convert EUC-KR 방법  (0) 2023.07.15
LogRotate Process  (0) 2023.05.28

댓글