2009-04-06 185 views
22

I tiene una tabla con una columna smallint que contiene porcentajes como números enteros (es decir, 50, 75, 85, etc.)¿Por qué SQL Server redondea los resultados de dividir dos enteros?

Cuando divido esta columna por 100, como en

SELECT MY_COLUMN/100 AS PCT_AS_FRACTION 
FROM MY_TABLE 

la el resultado se redondea al número entero más cercano. Por ejemplo, para una fila que contiene el número "50", obtengo cero como resultado.

puedo duplicar este con una simple declaración:

SELECT 50/100 AS TEST_VALUE 

¿Por qué, y cómo puedo obtener una mayor precisión en mi resultado?

Respuesta

32

Cuando se hace una división entera (entero dividido por un número entero) siempre se obtiene una respuesta entera. 50/100 = .50, que es 0 en el número entero.

¿Has intentado dividir MY_COLUMN por 100.0?

+2

Dividir por 100.0 trabajos.Explicación simple para un problema simple Gracias :) – JosephStyons

+0

Por cierto, multiplicar por 0.01 tiene el mismo efecto, y es quizás más obvio. – JosephStyons

+0

El término específico de 'integer-speak' es * truncation *. '75/100' todavía devuelve' 0'. La definición es simplemente eliminar cualquier parte fraccionaria del número. – Rabid

1

Estás haciendo una división de enteros. 50/100 es 0 con un resto de 50.

Debe usar la división de punto flotante.

24

Emita números enteros.

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

Está dividiendo 2 enteros, lo que da como resultado otro entero.

Debería posible colar esa manera, también

SELECT (50/100) :: numérica;

+0

Eso no parece funcionar con MS SQL Server. – svick

1

NB - Tenga cuidado porque el resto de la división entera no se redondea. Por el contrario, se descarta. Esto es equivalente a llamar a la función FLOOR sql.

Esto es común, y se define así porque al multiplicar dos enteros, nunca se producirá una fracción. Por lo tanto, nunca se asume una metodología de manejo de fracciones al multiplicar enteros, pero no se puede decir lo mismo de la división de enteros.

Esto a menudo puede tener un impacto al hacer una aritmética de fecha y hora en SQL.

1

Cuando está utilizando /(Divide) operador que

Devuelve el tipo de datos del argumento con la prioridad más alta.

y

Si un dividendo número entero se divide por un divisor entero, el resultado es un número entero que tiene alguna parte fraccionaria del resultado truncado.

Por lo tanto, debe convertir al menos uno de los operandos al tipo apropiado: decimal and numeric o float or real.

Cuestiones relacionadas