2010-06-11 3 views
3

플로트를 비교할 때 호스트의 문제점을 이해하고이 경우에 사용하는 것을 애도하지만 - 나는 테이블 작성자가 아니며 등반에는 작은 장애물이 있습니다 ...TSQL - 리터럴 플로트 값 만들기

누군가는 GUID가 사용되기를 기대하기 때문에 플로트를 사용하기로 결정했습니다. 특정 플로트 값으로 모든 레코드를 검색해야합니다.

sp_help MyTable 

-- Column_name Type Computed Length Prec 
-- RandomGrouping float no 8 53 

가 여기 내 순진 시도입니다 :

--yields no results 
SELECT RandomGrouping 
FROM MyTable 
WHERE RandomGrouping = 0.867153569942739 

그리고 여기에 약 작업을 시도입니다 : 내 순진 시도에서

--yields 2 records 
SELECT RandomGrouping 
FROM MyTable 
WHERE RandomGrouping BETWEEN 0.867153569942739 - 0.00000001 
     AND 0.867153569942739 + 0.00000001 

-- 0.867153569942739 
-- 0.867153569942739 

, 그 리터럴 부동 소수점 리터럴? 아니면 실제로 변환 된 십진수 리터럴입니까?

리터럴이 부동 소수점 리터럴이 아닌 경우 부동 소수점 리터럴을 만들기위한 구문은 무엇입니까?

편집 : 또 다른 가능성이 생겼습니다 ... 표시되는 것보다 더 정확한 숫자가이 열에 저장되어있을 수 있습니다. 이 번호를 나타내는 리터럴을 만드는 것은 불가능할 수 있습니다. 나는 이것이 사실임을 입증하는 대답을 받아 들일 것이다.


EDIT : DVK에 대한 응답.

TSQL은 MSSQLServer의 SQL 언어입니다.

이 스크립트가 작동하고, 그래서 평등 플로트 타입 사이에 결정 론적으로 수행 할 수 있습니다

DECLARE @X float 
SELECT top 1 @X = RandomGrouping 
FROM MyTable 
WHERE RandomGrouping BETWEEN 0.839110948199148 - 0.000000000001 
    AND 0.839110948199148 + 0.000000000001 
    --yields two records 
SELECT * 
FROM MyTable 
WHERE RandomGrouping = @X 

내가 말한 "약"범위에 대한 메소드 테스트 때문이다. 그 방법으로 나는 의도 한 가치와 같지 않은 가치를 얻을 수있었습니다.

십진법과 부동 소수점 사이의 세계 경계를 넘어서서 (의도적으로) 노력하지 않기 때문에 링크 된 기사가 적용되지 않습니다. 나는 수레만으로 일하려고 노력하고있어. 이것은 부동 소수점의 부동 소수점 값에 대한 비 변환성에 관한 것이 아닙니다. Zinglon에


응답 : 덕분에 내 기록을 찾을 수 있습니다

리터럴 값.

DECLARE @Y binary(8) 
SET @Y = 0x3FEAD9FF34076378 

SELECT * 
FROM MyTable 
WHERE convert(binary(8), RandomGrouping) = @Y 

답변

1

이 가능 MySQL 용 (위와 같이 기본적으로 같은 결론에) 문제의 꽤 괜찮은 쓰기이야 값이 표시 될 때 잘 리게됩니다. 열에 고유 한 제약 조건이 없다고 가정합니다. 그렇지 않으면 질문이 잘못 될 수 있습니다. 설치시 SSMS는이 스크립트에서보다 정확한 값을 잘라냅니다. 이 값이 서로 다른 경우

create table flt (f float not null primary key) 
insert into flt 
select 0.111111111111111 
union all 
select 0.1111111111111111 
select f, cast(f as binary(8)) from flt 

마찬가지로, 당신은 그들을 캐스팅 수있는 바이너리 (8)과 같이, 그 값을 기준으로이를 식별 :

select f from flt 
where cast(f as binary(8)) = 0x3FBC71C71C71C71C 
0

부동 소수점 리터럴인지 여부는 문제가 아닙니다.

문제는 Sybase (또는 모든 DB 서버)에서 두 개의 부동 소수점을 비교하는 것이 결정적이 아니란 점입니다. 4.00000000000000000000 ... 및 3.99999999999999999999 ...는 정확한 정확한 숫자이지만 동일하지 않기 때문입니다.

두 번째 해결 방법은 부동 소수점을 "평등"으로 비교하는 올바른 방법입니다 (즉, 정밀도와 동일 함).

왜 두 번째 접근 방식에 대해 "대략"노력하고 있습니까?당신은 당신이 사용하는 특정 DB 서버를 제공하지 않았기 때문에

, 여기

http://dev.mysql.com/doc/refman/5.0/en/problems-with-float.html