2009-04-06 3 views
22

는 I는 정수 (즉, 50, 75, 85 등)왜 SQL Server는 두 개의 정수를 나눈 결과를 반올림합니까?

I (100)에 의해이 열 나누기

SELECT MY_COLUMN/100 AS PCT_AS_FRACTION 
FROM MY_TABLE 

뿐만 비율을 포함 SMALLINT 열이 테이블을 결과는 가장 가까운 정수로 반올림됩니다. 예를 들어, 숫자가 "50"인 행의 경우 결과가 0입니다.

나는이 간단한 문을 복제 할 수 있습니다 :

SELECT 50/100 AS TEST_VALUE 

왜 있는지, 그리고 어떻게 내 결과에 더 많은 정밀도를 얻을 수 있나요?

답변

32

정수 나누기 (정수를 정수로 나눈 값) 할 때 항상 정수 대답을 얻습니다. 50/100 = .50, 이는 integer-speak에서 0입니다.

MY_COLUMN을 100.0으로 나누어 보았습니까?

+2

100.0으로 나누기.간단한 문제에 대한 간단한 설명. 감사합니다 :) – JosephStyons

+0

덧붙여 말하자면, 0.01을 곱하면 같은 효과를 가지며 아마도 더 분명합니다. – JosephStyons

+0

특정 '정수 - 말하기'용어는 * truncation *입니다. '75/100'은 여전히'0 '을 반환합니다. 정의는 단순히 숫자에서 소수 부분을 제거하는 것입니다. – Rabid

1

정수 나누기를하고 있습니다. 50/100은 0이고 나머지는 50입니다.

부동 소수점 나누기를 사용해야합니다.

24

숫자를 캐스트하십시오.

SELECT (cast(50 AS float)/100) 
0

당신은 다른 정수 결과 2의 정수를 나누는 것입니다.

그것은해야한다, 너무

SELECT를 그런 식으로 캐스팅하는 것이 가능 (50/100) : 숫자;

+0

MS SQL Server에서 작동하지 않는 것 같습니다. – svick

1

NB - 정수 나눗셈의 나머지가 반올림되지 않도록주의하십시오. 오히려 떨어졌습니다. 이것은 FLOOR SQL 함수를 호출하는 것과 같습니다.

이것은 일반적으로 두 정수를 곱하면 분수가 발생하지 않기 때문에 정의됩니다. 따라서 분수 처리 방법론은 정수를 곱할 때 결코 가정되지 않지만 정수 나누기에 대해서는 동일하다고 할 수 없습니다.

SQL에서 dateTime 산술을 수행 할 때 종종 영향을 미칠 수 있습니다.

1

당신이 그것을

는 우선 순위가 더 높은 인수의 데이터 형식을 반환 /(Divide) 연산자를 사용하고 있습니다.

정수 배당은 정수 제수로 나눈 경우, 그 결과는 절단 결과의 소수부를 갖는 정수 이다. decimal and numeric 또는 float or real :

그래서, 당신은 적어도 적절한 형식으로 피연산자 중 하나를 캐스팅해야합니다.

관련 문제