2010-12-09 2 views
8

FLOAT 데이터 유형에 저장된 일부 데이터를 INT 데이터 유형에 저장된 데이터로 변환하는 데 문제가 있습니다.SQL FLOAT를 SQL INT, 손실 된 데이터로 변환

DECLARE @data TABLE 
(
id INT, 
weight FLOAT 
) 
INSERT INTO @data VALUES(1,0.015662) 

SELECT CAST(weight * 1000000 AS INT) FROM @data 
SELECT 0.015662 * 1000000 
SELECT CAST(0.015662 * 1000000 AS INT) 

원하는 결과는 다음과 같습니다 다음 @data 테이블에서 나올 때 ID = 1 VALUE = 15662이 그러나, 나는이 얻을하지 않는 것 아래의 예는 내 문제를 보여줍니다. 나는 대신에 ID = 1 VALUE = 15661.

이것이 누구인지 아는 사람이 있습니까? 플로트 뉘앙스 같아요. 그러나 나는 위와 같은 것에 문제가있을 것이라고는 생각하지 못했습니다. 어떤 아이디어? 귀하의 도움에 미리 감사드립니다.

답변

16

이것은 전형적인 (int)((0.1+0.7)*10) 문제입니다. 부동 소수점은 임의의 정밀도를 가지므로 아주 간단한 경우에도 int로 캐스팅 할 때 약간의 데이터 손실이 발생할 수 있습니다.

대신 ROUND(weight * 1000000.0, 0)을 사용하십시오.

+0

ROUND (weight * 1000000.0, 0)는 어떤 시스템 작성자가 사용하는지 잘 모르기 때문에 더 좋을 것입니다. – Lex

0

이것은 컴퓨터에서 float의 특수성으로 인해 float 데이터 유형에 대한 일반적인 동작입니다. 소수점 이하의 고정 숫자가있는 10 진수 (숫자) 데이터 유형을 사용하십시오. 예 : 10 진수 (10, 6).