개발/Sql

[Sql] 부동소수점 - cast 함수로 decimal 타입 변환

kku-lab 2024. 11. 19. 14:05

결과 값이 7 이상이면 수상을 하는 로직이 있었다. 하지만 7 이상이었지만, 수상에서 제외 되었다. 왜??


X.fat_rate2 - X.fat_rate1 >= 7

10 - 3 >= 7

--부동소수점 표현
6.999999997 >= 7

 

쿼리문에서 부동소수점 처리를 안해줬기 때문에 일이 발생했다.


 

 

1. 부동소수점 숫자란?

 

부동소수점은 숫자를 소수점을 포함한 실수로 표현하는 방식이다.

이 방식은 컴퓨터가 실수를 표현할 때 정확하게 표현할 수 없는 숫자를 근사치로 나타내는 한계를 가진다.

 


 

2. 컴퓨터에서 부동소수점 표현하는 방법

 

컴퓨터는 실수를 이진수로 저장하므로, 이진수 부동소수점으로 값을 저장한다. 그러나 모든 실수가 정확하게 이진수로 표현될 수는 없다. 실제 0.1을 이진수로 정확하게 나타낼 수 없다. 0.1을 2진수로 표현하면 무한히 반복되는 소수로 나타나기 때문에, 근사값으로 저장된다.

실제 값 : 0.1  
컴퓨터에서 저장하는 값 : 0.10000000149011612

 

이러한 값으로 약간의 오차를 포함하여 저장한다.

 


 

3. 부동소수점 연산에서의 오차

 

부동소수점 방식은 정확한 계산을 보장하지 않는다.

SELECT 0.1 + .0.3; -- 결과는 0.30000000004가 될 수 있음.

 


 

문제점을 찾았으니 해결책은?

 

--전
X.fat_rate2 - X.fat_rate1 >= 7

--후
(cast(X.fat_rate2 as decimal(5,2))-cast( X.fat_rate1 as decimal(5,2))) >= 7

 

CAST ?

 

Sql에서 데이터 타입을 변환하는 함수이다. 연산에 맞게 값을 변환할 떄 사용된다고 한다.

 


 

DECIMAL(N,M) ?

 

N자리 숫자 중 소수점 M자리까지 허용한다는 뜻이다. 정밀도를 유지하기 위해 사용한다.

 

decimal(4,2) 는?

4는 숫자 전체 자릿수
2는 소수점 이하 자릿수

-99.99 ~ 99.99

 

decimal를 활용하여 소수점 이하 특정 자릿수까지 허용, 초과된 부분은 반올림하여 부동소수점 연산 문제를 해결하였다!!