본문 바로가기
Spring

[AWS RedShift] querydsl 레드시프트에서 나눗셈 때 소수점 표기 올바르게 하는 방법 2가지

by 루에 2023. 11. 7.
반응형

레드시프트에서 나눗셈을 하면 정수로 떨어지거나 특정 자리에서 버림처리 해버리는 경우가 발생한다.

이유는, 나눗셈할 때 정수/정수 로 들어왔을 경우 나눗셈 결과가 정수로 떨어지기 때문이다.

 

해결 방법은 숫자를 분명하게 정수가 아니도록 만들어주는 것이다.

쿼리로 던질 경우는 소수점 처리를 하면 되지만 Querydsl 등에서 파라미터로 던질 때는 아래와 같이 한다.

 

아래와 같은 식으로 함수를 구성한다고 하면 분모와 분자를 던질 때 1.0을 곱해서 던진다. multiply를 Double형으로 던져도 원하는 결과는 나오지 않는다.

public static NumberTemplate<BigDecimal> divideAndMultiplyAndRound(Integer scale,
		Integer multiply, Object... args) {
		return Expressions.numberTemplate(BigDecimal.class,
			"(case when {1} = 0 then 0 else ROUND((({0})/({1}))*" + multiply + ", " + scale + ")"
				+ " end)", args);
}

 

혹은 아래처럼 수식을 구성해서 분모, 분자 중 하나 이상을 명확하게 소수점표기형으로 구분해서 계산하도록 한다.

public static NumberTemplate<BigDecimal> floatDivideAndMultiplyAndRound(Integer scale,
		Integer multiply, Object... args) {
		return Expressions.numberTemplate(BigDecimal.class,
			"(case when {1} = 0 then 0 else ROUND(({0}/cast({1} as float))*" + multiply + ", "
				+ scale + ")"
				+ " end)",
			args);
	}

 

반응형

댓글