2013-04-08 3 views
5

제한 내가 저장 프로 시저에 사용할 수 있도록하려면 엑셀의 계산 다음과 같은 설정이있다. 나는 또한 한 줄SQL 부동 소수점 정밀도는 6 자리

declare @e decimal(18,15) = (1-(1-(45/448.2)))*448.2 

에서 계산을 실행 시도

declare @a decimal(18,15) = 45/448.2 
declare @b decimal(18,15) = [email protected] 
declare @c decimal(18,15) = [email protected] 
declare @d decimal(18,15) = @c * 448.2 

내가 값의 SQL을 반환 할 때 SQL에서

엑셀

CellA: 45/448.2 = 0.100401606425703 
CellB: 1-CellA = 0.899598393574297 
CellC: 1-CellB = 0.100401606425703 
CellD: CellC * 448.2 = 45.000000000000000 

는 내가이 다음을 수행하고 나에게 다음을 제공합니다 :

@a: 0.100401000000000 
@b: 0.899599000000000 
@c: 0.100401000000000 
@d: 44.999728200000000 

@e: 44.999728200000000 

SQL에서 소수 자릿수의 정밀도를 조정하려했지만 아무런 차이가 없으며 소수점의 처음 6 자리 만 반환합니다. 공식을 실행할 때

합니까 엑셀은 최적화합니까?

아이디어가 있으십니까?

declare @a decimal(18,15) = 45/448.2 
print @a 

이 때문에 데이터 유형입니다

--------------------------------------- 
0.100401000000000 

을 제공합니다

+0

시도, 말, 'SELECT 45/CAST (448.2 AS DECIMAL (18,1))'. [여기 링크] (http://stackoverflow.com/a/5385417/73226)는 결과로 생성 된 데이터 유형에 대한 규칙을 알려줍니다. –

+0

@MartinSmith는 내 대답이 45.000000000000085이더라도 이유를 설명 할 수 있겠지만 @a에 대해 더 완벽한 십진법을 제공합니까? – ScampDoodle

+0

위의 대답을 너무 게으른 반복문에서 설명한 두 링크에 설명되어 있습니다. e1/e2는 p = p1 - s1 + s2 + max (6, s1 + p2 + 1), s = max (6, s1 + p2 + 1)'을 준다. 'p'가'> 38'이면's'가'6'에서 잘립니다. –

답변

7

심지어 당신의 첫 번째 줄은 문제를 보여주기에 충분하다. 당신이

448.2 

을 말할 때 그것은

거래-SQL 문에서

, 소수점이있는 상수가 자동으로 이다, (the documentation 당)이 유형 decimalalso per the documentation의 상수로 해석입니다 최소 정밀도와 스케일을 사용하여 숫자 데이터 값으로 변환됩니다. 예를 들어, 상수는 12.345 5의 정밀도

3. 따라서 448.2decimal(4,3)된다 스케일이 숫자 값으로 변환된다. 45decimalis treated as having precision of 10 and scale 0 결합 integer이다. 우리가 나눌 때, the rules이 경우 136에 나오는 max(6, 0 + 3 + 1)의 결과 10 - 3 + 0 + max(6, 0 + 3 + 1)의 정밀도 및 스케일을 제공

Operation  Result precision      Result scale 
e1/e2  p1 - s1 + s2 + max(6, s1 + p2 + 1)  max(6, s1 + p2 + 1) 

을 말한다. 결과 만 여섯 소수점 이하 자릿수를 가지고 왜 6의 규모를 초래할

입니다.

해결 방법은 피연산자를 조작하기 전에 피연산자를 적절한 유형으로 가져 오는 것입니다. 예를 들어, 여기에 두 가지 방법은 다음과 같습니다

declare @a decimal(18,15) = 45/448.2e0 
select @a 

--------------------------------------- 
0.100401606425703 

가 명시 적으로 소수 규모의 공급 :

이 숫자 부동 소수점으로 처리하기 위해 강제로

declare @a decimal(18,15) = 45/cast(448.2 as decimal(18,10)) 
select @a 

--------------------------------------- 
0.100401606425703 
+0

이것은 정확한 경로에 나를 놓았습니다. 소수점 이하 자릿수를 조정해야했지만 궁극적으로 올바른 대답이었습니다. – ScampDoodle