문제

일부 금융 관련 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의 최소 '스케일'(소수점 수)을 적용하고 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top