SQL Server, a divisão retorna zero

86

Aqui está o código que estou usando no exemplo:

 PRINT @set1
 PRINT @set2

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

Aqui está o resultado:

47
638
0

Eu gostaria de saber por que está voltando em 0vez de0,073667712

Roch
fonte
é um 'int': DECLARE @weight INT
Roch

Respostas:

152

Declare set1 e set2 como floats em vez de inteiros ou converta-os em floats como parte do cálculo:

SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);
Martin
fonte
24

Quando você usa apenas inteiros em uma divisão, obterá uma divisão de inteiros. Quando você usa (pelo menos um) double ou float, você obterá uma divisão de ponto flutuante (e a resposta que deseja obter).

Então você pode

  1. declara uma ou ambas as variáveis ​​como float / double
  2. lançar uma ou ambas as variáveis ​​para float / double.

Não basta converter o resultado da divisão inteira para o dobro: a divisão já foi realizada como divisão inteira, portanto, os números atrás do decimal já foram perdidos.

Hans Ke st ing
fonte
4
+1 porque acho que você explicou um pouco melhor e mencionou que apenas um dos valores precisa ser um float / double
Chaulky
11

Porque é um número inteiro. Você precisa declará-los como números de ponto flutuante ou decimais, ou convertê-los para tal no cálculo.


fonte
Se eu alterar a variável @weight para float, é o suficiente?
Roch
10

Simplesmente multiplique a parte inferior da divisão por 1,0 (ou quantas casas decimais você quiser)

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight
HLGEM
fonte
Obrigado cara. Seu código me ajudou a responder a esta - stackoverflow.com/questions/20532187/… Você pode me dizer como truncar os zeros extras causados ​​por essa multiplicação? Obrigado.
Trojan.ZBOT
2

se você declará-lo como float ou qualquer formato decimal ele irá mostrar

0

Por exemplo :

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

Resultado: 0

Se você quiser a saída como

0,073667712

Por exemplo

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight
anishMarokey
fonte
Hum ok entendi agora, mas os dois números que quero dividir são variáveis ​​e não parece funcionar se .0000 não for especificado na variável.
Roch
então você precisa lançar @ set1 e @ set2 para float :)
anishMarokey
1

No SQL Server, a divisão direta de dois inteiros retorna um inteiro, mesmo se o resultado for o float. Há um exemplo abaixo para explicá-lo:

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

Apenas o último bloco retornará o 3,14285714285714. Apesar do segundo bloco definido com a precisão correta, o resultado será 3.00000.

Suat Atan PhD
fonte