SQL Server, la divisione restituisce zero


87

Ecco il codice che sto usando nell'esempio:

 PRINT @set1
 PRINT @set2

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

Ecco il risultato:

47
638
0

Vorrei sapere perché sta tornando 0invece di0,073667712


è un 'int': DECLARE @weight INT
Roch

Risposte:


156

Dichiara set1 e set2 come float invece di interi o lanciali in float come parte del calcolo:

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

24

Quando usi solo numeri interi in una divisione, otterrai una divisione intera. Quando usi (almeno uno) double o float, otterrai una divisione in virgola mobile (e la risposta che vuoi ottenere).

Così puoi

  1. dichiarare una o entrambe le variabili come float / double
  2. lancia una o entrambe le variabili in float / double.

Non eseguire semplicemente il cast del risultato della divisione intera per raddoppiare: la divisione era già stata eseguita come divisione intera, quindi i numeri dietro il decimale sono già persi.


4
+1 perché penso che tu l'abbia spiegato un po 'meglio e menzionato che solo uno dei valori deve essere un float / double
Chaulky

11

Perché è un numero intero. È necessario dichiararli come numeri in virgola mobile o decimali o lanciarli nel calcolo.


Se cambio la variabile @weight in float, è sufficiente?
Roch

10

Semplicemente moltiplicare la parte inferiore della divisione per 1.0 (o tutte le cifre decimali desiderate)

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

Grazie uomo. Il tuo codice mi ha aiutato a rispondere a questo: stackoverflow.com/questions/20532187/… Puoi dirmi come troncare gli zeri extra causati da quella moltiplicazione? Grazie.
Trojan.ZBOT

2

se lo dichiari come float o qualsiasi formato decimale verrà visualizzato

0

solo

Per esempio :

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

Uscita: 0

Se vuoi l'output come

0.073667712

Per esempio

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight

Hum ok ho capito ora ma i due numeri che voglio dividere sono variabili e non sembra funzionare se .0000 non è specificato nella variabile.
Roch

quindi devi lanciare sia @ set1 che @ set2 in float :)
anishMarokey

1

In SQL Server la divisione diretta di due numeri interi restituisce un numero intero anche se il risultato dovrebbe essere il float. Di seguito è riportato un esempio per spiegarlo:

--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 l'ultimo blocco restituirà 3,14285714285714. Nonostante il secondo blocco definito con la giusta precisione il risultato sarà 3.00000.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.