2012-02-24 2 views
0

float 데이터 형식에 이상한 문제가 있습니다. 아래 스크린 샷을 찾으십시오.sql float 열 패딩 일부 분량 및 경계 조건 실패

enter image description here

쿼리 1은 기록을 제공합니다. Query 2가 레코드를 제공하지 않을 때. netbk_amt는 테이블에 float 유형입니다. 또한 첫 번째 쿼리를 >= (convert(float, 100001))으로 변경하면 레코드가 제공되지 않습니다. 값이> 1000000하지만 < 1000001.입니다 그러나 1000000

이 쿼리에 무엇이 잘못되었는지 찾아 도와주세요로 테이블에이 표시처럼

보인다.

조회 :

select co_id, SUM(netbk_amt) from its_deal_sum where co_id = 19237 
group by co_id 
having convert(float,SUM(netbk_amt)) >= convert(float,1000000) 

select co_id, SUM(netbk_amt) from its_deal_sum where co_id = 19237 
group by co_id 
having convert(float,SUM(netbk_amt)) <= convert(float,1000000) 

내가 가지 이런 짓을하는 것은 의견 제안, 임시 수정 같은

select co_id, SUM(netbk_amt) from its_deal_sum where co_id = 19237 group by co_id having convert(money,SUM(netbk_amt)) = convert(money,1000000) 

. 그러나 분수를 무시하고 플로트로 견고한 문제를 찾아야합니다.

+3

왜 달러 금액에 대한 FLOAT를 사용하고 있습니까? 데이터 유형을 재검토 해 보시기 바랍니다. –

+0

Raghav, "첫 번째 쿼리를> = (convert (float, 100001))로 변경하면"썼습니다. 이 숫자는 10^5 + 1입니다. 원하는 것은 10^6 + 1입니다. –

+1

float의 값이 두 개의 float 사이의 차이로 계산되고 두 개의 float 중 하나를 float로 정확하게 표현할 수없는 경우 그 차이는 작은 부분으로 벗어날 수 있습니다. 예 : 1000001.01 - 0.01 = 1000000.0000000000001. (오류의 정확한 양은 확실치 않지만 일어날 수 있습니다.) Aaron의 말처럼 데이터 유형을 다시 고려하십시오. 부유물은 부적절합니다. –

답변

1

가 분수

을 무시하는 경우 당신이 원하는 모든 - 그것은 매우 간단합니다.

DECLARE @f float=2.000000000001 
SELECT @f,FLOOR(@f) 

결과 세트 :

(No column name) (No column name) 
2.000000000001  2