declare @tblTemp table (
A int ,
B float
)
declare @A int;
declare @B int
set @A = 230
set @B = 90
insert @tblTemp (A , B )
select
( convert(float,@A) / 100 * @B )
, ( convert(float,@A) / 100 * @B )
select * from @tblTemp
select convert(float,@A) / 100 -- 값은 2.3
, 2.3 * 90 -- -- 2.3 값에 90 을 더하면 207.0
, convert(int, (2.3 * 90) ) -- 207.0 을 int 형으로 변경 시, 207
, (convert(float,@A) / 100) * @B -- @B 를 곱하면 207
, convert(int,(convert(float,@A) / 100) * @B) -- @B 를 곱하고, int 형태로 변경 시 206
위와 같은 문제가 있었는데요. 이런 현상이 발생하는 이유가 너무 궁금해서 질문 드립니다.
위 코드를 보시면, 2.3 * 90 의 결과값인 207 을 int 형으로 변경하면 아무런 이상이 없는데요. 위의 값들을 변수에 담아서
계산을 실행 후, int 형으로 변경하면 ;; 왜 값이 변하게 되는지 이유를 도저히 모르겠습니다.
float 타입을 DECIMAL 또는 real 타입으로 사용할 경우 206 값으로 변경되는 일 없이 모두 207 값이 나옵니다.
도대체 내부에서 어떤 일이 벌어지기에 이런 현상이 발생하는 것인가요??
Comment 1
-
처리짱
2018.07.26 19:35
컴퓨터가 부동소수점 방식으로 저장하는 방식에 따른 오차인데..
207이 206.999999999999 이런식입니다. 207에 가장 가까운수..
이를 INT로 변환하다보니 소수점은 다 버림이 되고..
뭐라 설명을 드리기가 힘드네요.. ㅠㅠ 아래 쿼리를 실행해보세요...
declare @tblTemp table (
A bigint ,
B float
)
declare @A int;
declare @B int
set @A = 230
set @B = 90
insert @tblTemp (A , B )
select
( convert(float,@A) / 100 * @B * 10000000000000000)
, ( convert(float,@A) / 100 * @B * 10000000000000000 )
select * from @tblTemp