5

일부 재무 관련 SQL 코드를 디버깅 할 때 수치 (24,8) 수학 정밀도에 이상한 문제가 있음을 발견했습니다. 당신이 A +에서 B * C를 발현 결과가 0.123457SQL 서버 2005 숫자 정밀도 손실

SELECT A, B, C, A + B * C FROM ( SELECT CAST로 얻을 것이다 당신의 MSSQL에서 다음 쿼리를 실행

(0.12345678 AS NUMERIC (24,8)) A, C AS (NUMERIC (24,8) AS 500) B AS, CAST (NUMERIC (24,8) AS 0) CAST) T

AS

그래서 우리는 2 개의 중요한 상징을 잃었다. 이것을 여러 가지 방법으로 고정 시키려고 노력하면 중간 곱셈 결과 (0이된다!)를 numeric (24,8)으로 변환하면 문제가 없다.

마지막으로 해결책이 있습니다. 그러나 여전히 질문이 있습니다. 왜 MSSQL이 이런 식으로 동작하고 실제로 어떤 유형 변환이 샘플에서 발생 했습니까?

답변

7

부동 소수점 형의 추가가 정확하지 않은 것처럼 정밀도를 초과하면 부동 소수점 형식의 곱셈이 부정확 할 수 있습니다. Data Type Conversiondecimal and numeric을 참조하십시오.

NUMERIC(24,8)NUMERIC(24,8)을 곱한 결과 SQL Server는 내용이 아닌 형식 만 검사하므로 모든 48 자리를 저장할 수없는 경우 잠재적 인 16 자릿수 (24 - 8)를 저장하려고 시도합니다 정밀도 (최대 38). 두 개를 합치면 비 10 진수 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 

그래서 A + D가 감소 NUMERIC(24,8)NUMERIC(38,6) 사이에, SQL 서버가 아닌 소수의 잠재적 인 (32 개) 숫자를 저장하려고합니다,

다시
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 

에 감소

SELECT CAST(0.12345678 AS NUMERIC(38,6)) 

gi 당신이 둥근 후에 0.123457을 ves. 논리에 따라

+0

너는 NUMERIC (32,6)을 의미합니까?) ?? 합계가 38 – Edmondo1984

+0

@ Edmondo1984 인 경우 링크를 읽고 두 숫자의 의미를 이해하십시오. –

+0

두 개의 숫자 (24,8)를 곱하면 서버가 16 비트를 저장하고 (32,6)을 생성하려고 시도 할 것입니다. 어떻게하면 38,6이 될까요?Thanks – Edmondo1984

0

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 
+0

이러한 접근 방식은 SQL Server에서 소수 부분을 잘라내는 문제를 해결하지 못할 수도 있습니다. 소수 부분을 저장하려면 @a와 @b를 double로 변환해야 할 수도 있습니다. –

+0

감사합니다. SQL에서 정밀도 연산을 할 때 마음에 간직 할 것입니다. 지금까지는 사용할 필요가 없었지만 고려해야 할 몇 가지 문제가있을 수 있습니다. – kristof