문제
SQLSERVER 2005를 사용하는 이유를 아는 사람이 있습니까?
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)
11.74438969709659,
그러나 분모의 소수점을 15로 늘리면 덜 정확한 답변을 얻습니다.
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)
11.74438969를주세요
해결책
곱하기를 위해 우리는 각 인수의 소수점 이하 자리를 추가하여 (펜과 종이 사용) Dec 장소를 해결합니다.
그러나 사단은 머리를 날려 버립니다. 나는 지금 거짓말을하겠다.
그러나 SQL 용어로는 그렇습니다 정확히 예상대로.
--Precision = p1 - s1 + s2 + max(6, s1 + p2 + 1)
--Scale = max(6, s1 + p2 + 1)
--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 9 + 54 = 72
--Max P = 38, P & S are linked, so (72,54) -> (38,20)
--So, we have 38,20 output (but we don use 20 d.p. for this sum) = 11.74438969709659
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)
--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 15 + 54 = 84
--Max P = 38, P & S are linked, so (84,54) -> (38,8)
--So, we have 38,8 output = 11.74438969
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)
팔로우하면 동일한 수학을 할 수 있습니다 이 규칙 또한 각 숫자 쌍을 처리하는 경우
- 146804871.212533000000000 및 1249999.99900000
- 146804871.212533000000000 및 1249999.99900000000000
다른 팁
곧 말하면 10 진수 (25,13)를 사용하면 모든 계산에서는 괜찮을 것입니다. 선언 된대로 정밀도를 얻을 수 있습니다. 10 자리 숫자 앞에 12 자리, 후 13 자리 숫자. 규칙은 : P+S는 38과 같아야하며 안전한 편에있을 것입니다! 왜 이런거야? SQL Server에서 산술 구현이 매우 잘못 되었기 때문입니다! 그들이 고칠 때까지 그 규칙을 따르십시오.
나누기 값을 플로트에 던지면 정답을 제공한다는 것을 알았습니다.
select 49/30 (result = 1)
될 것입니다 :
select 49/cast(30 as float) (result = 1.63333333333333)
우리는 마법의 전환에 대한 수수께끼가 많았습니다.
P & S는 연결되어 있으므로 다음과 같습니다.
(72,54) -> (38,29)
(84,54) -> (38,8)
가정합니다 (38,29)
오타이고해야합니다 (38,20)
, 다음은 수학입니다.
나. 72-38 = 34, ii. 54-34 = 20
나. 84-58 = 46, ii. 54-46 = 8
그리고 이것은 추론입니다.
나. 출력 정밀 최대 정밀도는 우리가 버릴 숫자입니다.
II. 그런 다음 출력 스케일이 우리가 버릴 것이 적 으면 출력 스케일의 남은 숫자가 있습니다.
이것이 다른 사람이 이것을 이해하려고 노력하는 데 도움이되기를 바랍니다.
인수가 아닌 표현을 변환하십시오.
select CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999)
다음을 사용하면 도움이 될 수 있습니다.
SELECT COL1 * 1.0 / COL2