Domanda

Qualcuno sa perché, usando SQLServer 2005

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

mi dà 11.74438969709659,

ma quando aumento le cifre decimali sul denominatore a 15, ottengo una risposta meno accurata:

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

dammi 11.74438969

È stato utile?

Soluzione

Per la moltiplicazione aggiungiamo semplicemente il numero di posizioni decimali in ogni argomento insieme (usando carta e penna) per calcolare i decimi di output.

Ma la divisione ti fa saltare la testa. Ora vado a coricarmi.

In termini di SQL, tuttavia, è esattamente come previsto.

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

Puoi fare la stessa matematica se segui questa regola anche se tratti ogni coppia di numeri come

  • 146804871.212533000000000 e 12499999.999900000
  • 146804871.212533000000000 e 12499999.99990000000000000

Altri suggerimenti

Per dirla in breve, usa DECIMAL (25,13) e andrà tutto bene con tutti i calcoli: otterrai la precisione esattamente come dichiarato: 12 cifre prima del punto decimale e 13 cifre decimali dopo. La regola è: p + s deve essere uguale a 38 e sarai al sicuro! Perchè è questo? A causa della pessima implementazione dell'aritmetica in SQL Server! Fino a quando non lo risolvono, segui quella regola.

Ho notato che se lanci il valore di divisione su float, ti dà la risposta corretta, cioè:

select 49/30                   (result = 1)

diventerebbe:

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

Eravamo perplessi sulla transizione magica,

  

P & amp; S sono collegati, quindi:

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

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

  4.   

Supponendo che (38,29) sia un refuso e dovrebbe essere (38,20) , la seguente è la matematica:

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

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

E questo è il ragionamento:

i. Precisione di uscita meno precisione massima sono le cifre che elimineremo.

II. Quindi la scala di output meno ciò che stiamo per buttare ci dà ... cifre rimanenti nella scala di output.

Spero che questo aiuti chiunque altro a dare un senso a questo.

Converti l'espressione non gli argomenti.

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

L'uso di quanto segue può essere d'aiuto:

SELECT COL1 * 1.0 / COL2
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top