2009-11-03 11 views
62

Aquí está el código que estoy usando en el ejemplo:SQL Server, la división devuelve cero

PRINT @set1 
PRINT @set2 

SET @weight= @set1/@set2; 
PRINT @weight 

Aquí está el resultado:

47 
638 
0 

Me gustaría saber por qué está volviendo 0 vez de 0,073667712

+0

¿Qué tipo de datos es @weight? –

+0

es un 'int': DECLARAR @weight INT – Roch

Respuesta

108

De cualquier declarar conjunto1 y conjunto2 como flotadores en lugar de números enteros o arrojándolos a los flotadores como parte del cálculo:

SET @weight= CAST(@set1 AS float)/CAST(@set2 AS float); 
11

Porque es un número entero. Debe declararlos como números de coma flotante o decimales, o enviarlos a los mismos en el cálculo.

+0

Si cambio la variable @weight para flotar, ¿es suficiente? – Roch

2

si se declara como flotador o cualquier formato decimal se mostrará

única

por ejemplo:

declare @weight float; 

SET @weight= 47/638; PRINT @weight 

de salida: 0

Si desea que la salida como

0,073667712

Ej

declare @weight float; 

SET @weight= 47.000000000/638.000000000; PRINT @weight 
+0

Hum ok Lo entiendo ahora, pero los dos números que quiero dividir son variables, y no parece funcionar si el .0000 no está especificado en la variable. – Roch

+0

por lo que necesita lanzar tanto @ set1 como @ set2 para flotar :) – anishMarokey

13

Cuando usa solo enteros en un div isión, obtendrás una división entera. Cuando use (al menos uno) double o float, obtendrá la división de punto flotante (y la respuesta que desea obtener).

Para que pueda

  1. declarar una o ambas de las variables como float/double
  2. fundido una o ambas de las variables a flotar/doble.

No solo copie el resultado de la división entera a doble: la división ya se realizó como división entera, por lo que los números detrás del decimal ya se han perdido.

+1

+1 porque creo que lo explicó un poco mejor y mencionó que solo uno de los valores debe ser flotante/doble – Chaulky

7

Simplemente mutiply la parte inferior de la división por 1.0 (o tantos decimales como desee)

PRINT @set1 
PRINT @set2 
SET @weight= @set1/@set2 *1.00000; 
PRINT @weight 
+0

Gracias hombre. Su código me ayudó a responder este - http://stackoverflow.com/questions/20532187/how-to-calculate-percent-of-total-within-group-by-statement ¿Puede decirme cómo truncar los ceros adicionales? causado por esa multiplicación? Gracias. –

1

En la división directa de SQL Server de dos vueltas enteros entero par si el resultado debe ser el flotador. Hay un ejemplo más abajo para conseguirlo a través de:

--1-- 
declare @weird_number_float float 
set @weird_number_float=22/7 
select @weird_number_float 

--2-- 
declare @weird_number_decimal decimal(18,10) 
set @weird_number_decimal=22/7 
select @weird_number_decimal 

--3-- 
declare @weird_number_numeric numeric 
set @weird_number_numeric=22/7 
select @weird_number_numeric 

--Right way 

declare @weird_number float 
set @weird_number=cast(22 as float)/cast(7 as float) 
select @weird_number 

Sólo último bloque devolverá el 3,14285714285714. A pesar del segundo bloque definido con precisión correcta, el resultado será 3.00000.

Cuestiones relacionadas