SQL Server 2005 숫자 정밀 손실
-
02-07-2019 - |
문제
일부 금융 관련 SQL 코드를 디버깅하면 숫자 (24,8) 수학 정밀도에서 이상한 문제가 발견되었습니다.
MSSQL에서 다음 쿼리를 실행하면 A + B * C 표현식 결과가 0.123457입니다.
A, B, C, A + B * C를 선택하여 (CAST (0.12345678 AS 숫자 (24,8)), A로 캐스트 (0) B로 CAST (0), CAST (500으로 숫자 (24)를 선택하십시오. , 8)) c) t
그래서 우리는 두 가지 중요한 상징을 잃었습니다. 이것을 다른 방식으로 고정 시키려고 노력하면 중간 곱셈 결과 (0!)를 숫자 (24,8)로 변환하면 잘 작동합니다.
그리고 마지막으로 해결책이 있습니다. 그러나 여전히 나는 질문이 있습니다. 왜 MSSQL이 이런 식으로 동작하고 실제로 내 샘플에서 어떤 유형 변환이 발생 했는가?
해결책
플로트 유형의 추가가 부정확 한 것처럼, 정밀도를 초과하면 소수 유형의 곱셈이 부정확하거나 부정확 할 수 있습니다. 보다 데이터 유형 변환 그리고 소수 및 숫자.
당신이 곱했기 때문에 NUMERIC(24,8)
그리고 NUMERIC(24,8)
, 및 SQL Server는 컨텐츠가 아닌 유형 만 확인할 수 있습니다. 아마도 48 자리의 정밀도를 모두 저장할 수 없을 때 잠재적 인 16 개의 비 학위 숫자 (24-8)를 저장하려고 시도 할 것입니다 (Max Is 38). 그들 중 2 개를 결합하면 32 개의 비 시체 숫자를 얻을 수 있으므로 6 자리 숫자 만 남습니다 (38-32).
따라서 원래 쿼리
SELECT A, B, C, A + B * C
FROM ( SELECT CAST(0.12345678 AS NUMERIC(24,8)) AS A,
CAST(0 AS NUMERIC(24,8)) AS B,
CAST(500 AS NUMERIC(24,8)) AS C ) T
감소합니다
SELECT A, B, C, A + D
FROM ( SELECT CAST(0.12345678 AS NUMERIC(24,8)) AS A,
CAST(0 AS NUMERIC(24,8)) AS B,
CAST(500 AS NUMERIC(24,8)) AS C,
CAST(0 AS NUMERIC(38,6)) AS D ) T
다시, 사이 NUMERIC(24,8)
그리고 NUMERIC(38,6)
, SQL Server A + D
감소합니다
SELECT CAST(0.12345678 AS NUMERIC(38,6))
당신에게주는 것 0.123457
반올림 후.
다른 팁
논리에 이어 지적한 논리 EED3SI9N 그리고 당신이 당신의 질문에서 말한 것은 수학 작업을 수행 할 때 최선의 접근 방식은 기능으로 추출하고 각 작업 후에 정밀도를 지정하는 것입니다.
이 경우 기능은 다음과 같은 것처럼 보일 수 있습니다.
create function dbo.myMath(@a as numeric(24,8), @b as numeric(24,8), @c as numeric(24,8))
returns numeric(24,8)
as
begin
declare @d as numeric(24,8)
set @d = @b* @c
return @a + @d
end
그것이 말하는 것에도 불구하고 정밀, 스케일 및 길이 (Transact-SQL). 또한 분열 등과 동일한 곱하기 숫자 유형에 6의 최소 '스케일'(소수점 수)을 적용하고 있다고 생각합니다.