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


é 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);

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.


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.


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

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.