SQL Server, la división devuelve cero

86

Aquí está el código que estoy usando en el ejemplo:

 PRINT @set1
 PRINT @set2

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

Aquí está el resultado:

47
638
0

Me gustaría saber por qué está regresando en 0lugar de0,073667712

Roch
fuente
es un 'int': DECLARE @weight INT
Roch

Respuestas:

152

Declare set1 y set2 como flotantes en lugar de enteros o conviértalos en flotantes como parte del cálculo:

SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);
Martín
fuente
24

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

Así que puedes

  1. declarar una o ambas variables como flotante / doble
  2. lanzar una o ambas variables para flotar / duplicar.

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

Hans Ke st ing
fuente
4
+1 porque creo que lo explicaste un poco mejor y mencionaste que solo uno de los valores debe ser flotante / doble
Chaulky
11

Porque es un número entero. Debe declararlos como números de punto flotante o decimales, o convertirlos en tales en el cálculo.


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

Simplemente divida la parte inferior de la división por 1.0 (o tantas posiciones decimales como desee)

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight
HLGEM
fuente
Gracias hombre. Su código me ayudó a responder a este: stackoverflow.com/questions/20532187/… ¿Puede decirme cómo truncar los ceros adicionales causados ​​por esa multiplicación? Gracias.
Trojan.ZBOT
2

si lo declara como flotante o cualquier formato decimal, se mostrará

0

solamente

P.ej :

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

Salida: 0

Si quieres la salida como

0.073667712

P.ej

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight
anishMarokey
fuente
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
así que necesitas lanzar tanto @ set1 como @ set2 para flotar :)
anishMarokey
1

En SQL Server, la división directa de dos enteros devuelve un entero incluso si el resultado debe ser el flotante. Hay un ejemplo a continuación para transmitirlo:

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

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

Doctorado Suat Atan
fuente