2009-04-06 20 views
22

Ho una tabella con una colonna smallint contenente percentuali come numeri interi (cioè, 50, 75, 85, ecc)Perché SQL Server termina i risultati della divisione di due numeri interi?

Quando divido questa colonna 100, come in

SELECT MY_COLUMN/100 AS PCT_AS_FRACTION 
FROM MY_TABLE 

la il risultato è arrotondato al numero intero più vicino. Ad esempio, per una riga che contiene il numero "50", ottengo zero come risultato.

posso duplicare questo con una semplice dichiarazione:

SELECT 50/100 AS TEST_VALUE 

Perché è questo, e come posso ottenere una maggiore precisione nel mio risultato?

risposta

32

Quando si esegue la divisione integer (numero intero diviso per numero intero) si ottiene sempre una risposta intera. 50/100 = .50, che è 0 in numero intero.

Hai provato a dividere MY_COLUMN per 100.0?

+2

Dividendo per 100,0 opere.Semplice spiegazione per un semplice problema. Grazie :) – JosephStyons

+0

Per inciso, moltiplicare per 0,01 ha lo stesso effetto, ed è forse più ovvio. – JosephStyons

+0

Il termine specifico 'speak integer' è * truncation *. '75/100' restituisce ancora' 0'. La definizione è semplicemente rimuovere qualsiasi parte frazionaria dal numero. – Rabid

1

Stai facendo divisione intera. 50/100 è 0 con un resto di 50.

È necessario utilizzare la divisione in virgola mobile.

24

Numeri interi cast.

SELECT (cast(50 AS float)/100) 
0

Si stanno dividendo 2 numeri interi che si traducono in un altro numero intero.

Dovrebbe possibile lanciare in questo modo, anche

SELECT (50/100) :: numerica;

+0

Sembra non funzionare con MS SQL Server. – svick

1

NB - Prestare attenzione in quanto il resto della divisione intera non è arrotondato. Piuttosto, è caduto. Questo equivale a chiamare la funzione sql di FLOOR.

Questo è comune ed è definito come tale perché quando si moltiplicano due numeri interi, una frazione non si verificherà mai. Pertanto una metodologia di gestione delle frazioni non viene mai assunta quando si moltiplicano gli interi, ma non si può dire lo stesso per la divisione dei numeri interi.

Questo può spesso avere un impatto quando si fa l'aritmetica dataTime in SQL.

1

Quando si utilizza /(Divide) operatore è

Restituisce il tipo di dati dell'argomento con precedenza maggiore.

e

Se un dividendo intero è diviso da un divisore intero, il risultato è un intero che ha una parte frazionaria del risultato troncato.

Quindi, è necessario trasmettere almeno uno degli operandi al tipo appropriato: decimal and numeric o float or real.

Problemi correlati