Pergunta

Alguém sabe por que, usando SQLServer de 2005

SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)

me dá 11,74438969709659,

mas quando eu aumentar as casas decimais no denominador a 15, eu recebo uma resposta menos precisa:

SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)

me dar 11.74438969

Foi útil?

Solução

Para a multiplicação nós simplesmente adicionar o número de casas decimais em cada argumento em conjunto (usando papel e caneta) para trabalhar fora de saída Dez lugares.

Mas a divisão apenas sopra a cabeça distante. Eu estou a deitar agora.

termos no SQL, porém, é exatamente como o esperado.

--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)

Você pode fazer a mesma matemática se follow esta regra também, se você tratar cada par de números como

  • 146804871,212533000000000 e 12.499.999,999900000
  • 146804871,212533000000000 e 12.499.999,999900000000000

Outras dicas

Para colocá-lo em breve, uso DECIMAL (25,13) e você vai ficar bem com todos os cálculos - você vai ter precisão da direita, conforme declarado: 12 dígitos antes do ponto decimal e 13 dígitos decimais após. Regra é: p + s deve ser igual a 38 e você vai estar no lado seguro! Por que é isso? Por causa de muito ruim implementação de aritmética no SQL Server! Até que eles corrigi-lo, seguir essa regra.

Tenho notado que se você converter o valor dividindo a flutuar, dá-lhe a resposta correta, ou seja:.

select 49/30                   (result = 1)

se tornaria:

select 49/cast(30 as float)    (result = 1.63333333333333)

Estávamos confundindo sobre a transição mágica,

P & S estão ligados, assim:

  1. (72,54) -> (38,29)

  2. (84,54) -> (38,8)

Assumindo (38,29) é um erro de digitação e deve ser (38,20), o seguinte é a matemática:

  1. i. 72-38 = 34, ii. 54-34 = 20

  2. i. 84-58 = 46, ii. 54-46 = 8

E este é o raciocínio:

i. precisão de saída menos precisão máxima é os dígitos vamos jogar fora.

ii. Então escala de saída menos o que vamos jogar fora nos dá ... restante dígitos na escala de saída.

Espero que isso ajude alguém tentando dar sentido a isso.

Converter a expressão não os argumentos.

select  CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999)

Usando a seguir podem ajudar:

SELECT COL1 * 1.0 / COL2
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top