2009-11-03 20 views
62

Ecco il codice che sto usando l'esempio:SQL Server, divisione restituisce zero

PRINT @set1 
PRINT @set2 

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

Ecco il risultato:

47 
638 
0 

Mi piacerebbe sapere perché è il ritorno 0 invece di 0,073667712

+0

Quale tipo di dati è @weight? –

+0

è un 'int': DECLARE @weight INT – Roch

risposta

108

In entrambi i dichiarare set1 e set2 come carri invece di numeri interi o gettato loro di carri come parte del calcolo:

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

Perché è un numero intero. È necessario dichiararli come numeri in virgola mobile o decimali o eseguire il cast in tali valori nel calcolo.

+0

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

2

se si dichiara come float o qualsiasi formato decimale verrà visualizzato

solo

es:

declare @weight float; 

SET @weight= 47/638; PRINT @weight 

uscita: 0

Se si desidera che l'uscita come

0,073667712

Eg

declare @weight float; 

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

Hum ok Ora capisco ma i due numeri che voglio dividere sono variabili, e sembra non funzionare se il .0000 non è specificato nella variabile. – Roch

+0

quindi devi lanciare sia @ set1 che @ set2 per rendere mobile :) – anishMarokey

13

Quando si utilizzano solo numeri interi in un div isione, otterrai la divisione intera. Quando usi (almeno uno) il doppio o il float, otterrai una divisione in virgola mobile (e la risposta che vuoi ottenere).

in modo da poter

  1. dichiarare una o entrambe le variabili come float/double
  2. gettato una o entrambe le variabili a galleggiare/doppia.

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

+1

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

7

semplicemente moltiplicarlo nella parte inferiore della divisione per 1.0 (o tanti decimali come si vuole)

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

Grazie man. Il tuo codice mi ha aiutato a rispondere a questo: http://stackoverflow.com/questions/20532187/how-to-calculate-percent-of-total-within-group-by-statement Puoi dirmi come troncare gli zeri in più causato da quella moltiplicazione? Grazie. –

1

nella divisione diretta SQL Server di due ritorni interi numero intero, anche se il risultato dovrebbe essere il galleggiante. C'è un esempio qui sotto per ottenerlo attraverso:

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

Proprio ultimo blocco restituirà il 3,14285714285714. Nonostante il secondo blocco definito con la giusta precisione, il risultato sarà 3.00000.

Problemi correlati